﻿using System;
using System.Collections.Generic;
using DoNet.SFExpress.Framework.EXP_RECE;

namespace DoNet.SFExpress.Framework.COM_RECE_MRDS
{
    /// <summary>
    /// 解决方案API
    /// </summary>
    public class ComReceMrdsApi
    {
        #region 医寄通服务类接口

        /// <summary>
        /// 时效运费查询接口
        /// 时效运费接口,默认查包裹的首重运费和时效 ： 就是查询包裹的运费（根据包裹的信息）
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsFreightQuery(string partnerID, string checkword, MsgDataRequestMrdsFreightQuery data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            时效运费接口,默认查包裹的首重运费和时效 ： 就是查询包裹的运费（根据包裹的信息）

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_FREIGHT_QUERY
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> Order
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	expressType	String(5)	否		使用的顺丰产品类型 默认查询标快；：1，1：表示“顺丰特快” 2：表示“顺丰标快（陆运），208为特惠专配，229为精温专递，232为精温专递（样本），233为精温专递（样本陆），采用其他产品请先咨询业务方”
            3	parcelWeighs	String(32)	否		包裹重量
            4	srcProvince	String	是		寄件地址-省
            5	srcCity	String	是		寄件地址-市
            6	srcDistrict	String	是		寄件地址-区
            7	srcAddress	String	是		寄件地址-详细地址
            8	destProvince	String	是		收件地址-省
            9	destCity	String	是		收件地址-市
            10	destDistrict	String	是		收件地址-区
            11	destAddress	String	是	1	收件地址-详细地址
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000008",
                "destAddress": "白石龙一区",
                "destCity": "深圳市",
                "destDistrict": "龙华新区",
                "destProvince": "广东省",
                "srcAddress": "中山大道",
                "srcCity": "上海市",
                "srcDistrict": "黄浦区",
                "srcProvince": "上海市"
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	object	否	响应编码
            2.4. 元素<响应> Response/result
            #	属性名	类型(约束)	必填	描述
            1	deliverTime	String(30)	否	预计交货时间
            2	price	String(60)	否	价格
            3	businessTypeDesc	String(60)	否	产品类型描述
            4	businessType	String(60)	否	产品类型
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "message": null,
                "code": "SUCCESS",
                "result": [
                    {
                        "deliverTime": "2021-05-05 12:00:00",
                        "price": 1500,
                        "businessTypeDesc": "顺丰标快",
                        "businessType": "2"
                    }
                ]
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_FREIGHT_QUERY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsFreightQuery>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 查询保费接口
        /// 查询包裹保费
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsSupportValue(string partnerID, string checkword, MsgDataRequestMrdsSupportValue data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            查询包裹保费

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_SUPPORT_VALUE
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> PremiumQueryDTO
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	productCode	String	是		快递产品代码 S1:顺丰特快 S2:顺丰标快 SE0122:特惠专配 SE0024:精温专递
            3	statementValue	Long	是		声明价值 单位：分
            4	zoneCode	String	是		寄件网点代码
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000009",
                "productCode": "S1",
                "zoneCode": "755",
                "statementValue": 1000000
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	Long	否	保费 单位：分
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "message": null,
                "code": "SUCCESS",
                "result": 1
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_SUPPORT_VALUE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsSupportValue>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 筛单接口
        /// 订单筛选接口： 客户系统通过此接口向顺丰系统发送主动的筛单请求,用于判断客户的收、派地址是否属于顺丰的收派范围。建议在调用批量下单接口前，先调用此接口。（判断是否运送得到）
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsSieveOrder(string partnerID, string checkword, MsgDataRequestMrdsSieveOrder data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            订单筛选接口： 客户系统通过此接口向顺丰系统发送主动的筛单请求,用于判断客户的收、派地址是否属于顺丰的收派范围。建议在调用批量下单接口前，先调用此接口。（判断是否运送得到）

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_SIEVE_ORDER
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> AddressSieveDTO
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	destAddress	String	是		收件地址（精确到省市区）
            3	srcAddress	String	是		发件地址（精确到省市区）
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000009",
                "srcAddress": "广东省深圳市南山区软件产业基地1C7楼",
                "destAddress": "广东省深圳市南山区软件产业基地1B7楼"
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	String	否	相应结果
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "message": null,
                "code": "SUCCESS",
                "result": "校验结果: 收派地址有效,可正常下单; destAddress--->广东省深圳市南山区软件产业基地1B7楼,srcAddress--->广东省深圳市南山区软件产业基地1C7楼"
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_SIEVE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsSieveOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = msgDataResponse.result;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 新增直连订单
        /// 直连下单接口： 可以批量下单接口，如果采用批量下单模式，单次不要超过10单；
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsAddOrder(string partnerID, string checkword, MsgDataRequestMrdsAddOrder data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            直连下单接口： 可以批量下单接口，如果采用批量下单模式，单次不要超过10单；

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_ADD_ORDER
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> Order
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	orderThirds	List<OrderThirdDO>	否		订单列表
            2.3. 元素<请求>Order/OrderThirdDO
            #	属性名	类型(约束)	必填	默认值	描述
            1	productCode	String(16)	是		产品code：“病案寄递” ：MEDICAL_CHART"， “中药寄递”： CHINESE_HERBAL"， “其他”：“OTHER”
            2	bspOrderNo	String(32)	是		业务订单号(医院自定义、唯一不重复)
            3	callFlag	String(1)	否		是否下callFlag（预约上门取件） ：0：不下call,1下call（默认为0，不下call）
            4	sendStartTime	String(32)	条件		预约上门时间；和callFlag对应
            5	orderTaskFlag	number	否		微派下单任务标识：详情请咨询我们的商务人员（仅支持月结用户使用该功能）
            6	orderTaskCode	String(32)	条件		微派产品编码和orderTaskFlag = 1 对应
            7	verifyCode	String(32)	条件		微派产品编码和orderTaskFlag = 1 对应.特定得产品编码使用
            8	payMethod	number	是		付款方式：1（注：1为寄付，2为到付，寄付月结的payMethod传1,再传月结卡号即可,3为寄付转第三方）
            9	expressType	String(32)	是		顺丰产品类型: 默认为1：注：2为顺丰标快（陆运），208为特惠专配，采用其他产品请先咨询业务方
            10	patientName	String(32)	条件		患者姓名【productCode： CHINESE_HERBAL 则必传，其他的没要求】
            11	patientPhone	String(32)	否		患者电话
            12	patientIdentityCardNo	String(32)	否		患者身份证号
            13	srcName	String(32)	是		寄件人姓名
            14	srcPhone	String(32)	是		寄件人电话
            15	srcProvince	String(32)	是		寄件人省份
            16	srcCity	String(32)	是		寄件人城市
            17	srcDistrict	String(32)	是		寄件人镇/区
            18	srcAddress	String	是		寄件人详细地址：必须准确真实
            19	destName	String(32)	是		收件人姓名
            20	destPhone	String(32)	是		收件人电话
            21	destProvince	String(32)	是		收件人省份
            22	destCity	String(32)	是		收件人城市
            23	destDistrict	String(32)	是		寄件人镇/区
            24	destAddress	String(32)	是		寄件人详细地址：必须准确真实
            25	parcelWeighs	String(32)	否		包裹重量
            26	packagesNo	String(32)	是		包裹数量
            27	depositumInfo	String(32)	是		寄托物名称
            28	depositumNo	String(32)	否		寄托物数量，不填默认1
            29	remark	String(32)	否		备注
            30	monthlyCard	String(32)	条件		月结卡号 如果是月结，必须要填，（注意：到付的情况下，如果传了月结，也会按寄付月结来下单）
            31	statementValue	String(32)	否		声明价值（单位：分）
            32	packIndividuationMoney	String(32)	否		包装服务金额（单位：分）
            33	collectionMoney	number	否		代收金额（单位：分）
            34	collectionNo	String(32)	条件		代收卡号，如果代收金额不为空，此字段必填
            35	srcCompany	String(32)	否		寄件公司
            36	needReturnTrackingNumber	String(1)	否		配送方式：0-常温，1-温控
            37	needHandover	number	否		是否需要交接,1-需要，不填或其他值为不需要
            38	prescriptionNos	String	否		客户处方单号,如有多个处方单号则用逗号拼接
            39	deliveryMethod	number	否		是否需要温度追溯增值服务,1-需要，其他为不需要，默认不需要
            40	needTemperatureRetrospect	number	否		是否使用温度追溯（实时）服务0不使用（默认），1使用
            41	takeMedicineIdentityName	String	条件		取药凭证名称（好比 处方号，中药编号等）【productCode： CHINESE_HERBAL 则必传，其他的没要求】
            42	takeMedicineIdentityValue	String	条件		取药凭证值【productCode： CHINESE_HERBAL 则必传，其他的没要求】
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000009",
                "orderThirds": [
                    {
                        "bspOrderNo": "lfcs543133415123613",
                        "productCode": "MEDICAL_CHART",
                        "callFlag": "0",
                        "depositumInfo": "西瓜",
                        "depositumNo": "3",
                        "destAddress": "白石龙一区175栋",
                        "destCity": "深圳市",
                        "destDistrict": "龙华新区",
                        "destName": "梁飞",
                        "destPhone": "15986618684",
                        "destProvince": "广东省",
                        "expressType": "1",
                        "hospitalCode": "",
                        "monthlyCard": "",
                        "packagesNo": 1,
                        "parcelWeighs": "10",
                        "patientIdentityCardNo": "411081199102201259",
                        "patientName": "佩奇",
                        "patientPhone": "15113149999",
                        "payMethod": 1,
                        "remark": "备注啊",
                        "srcAddress": "中山大道",
                        "srcCity": "上海市",
                        "srcDistrict": "黄浦区",
                        "srcName": "佩奇",
                        "srcPhone": "15113149999",
                        "srcProvince": "上海市"
                    }
                ]
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	successResult	否	响应编码
            2.4. 元素<响应> Response/successResult
            #	属性名	类型(约束)	必填	描述
            1	mailNo	String	否	运单号
            2	bspOrderNo	String	否	业务订单号
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "message": null,
                "code": "SUCCESS",
                "result": {
                    "successResult": [
                        {
                            "mailNo": "SF1231111575123",
                            "bspOrderNo": "lfcs543133415123613"
                        }
                    ]
                }
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_ADD_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsAddOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 取消订单接口
        /// 取消订单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsCancelOrder(string partnerID, string checkword, MsgDataRequestMrdsCancelOrder data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            取消订单

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_CANCEL_ORDER
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> OrderNoDTO
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	orderNo	String	是		业务订单号
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000009",
                "orderNo": "123"
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	String	否	操作结果
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "message": null,
                "code": "SUCCESS",
                "result": "取消成功"
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_CANCEL_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsCancelOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = msgDataResponse.result;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 面单查询接口
        /// 面单查询接口，用于打印面单。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsListPrintInfo(string partnerID, string checkword, MsgDataRequestMrdsListPrintInfo data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            面单查询接口，用于打印面单。

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_LIST_PRINT_INFO
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> OrderNoDTO
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	orderNo	String	是		业务订单号
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000009",
                "orderNo": "lfcs543133415123613"
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	List<SelfPrintDO>	否	操作结果
            2.4. 元素<响应> Response/SelfPrintDO
            #	属性名	类型(约束)	必填	描述
            1	orderId	String	否	客户订单号
            2	merchantOrderNo	String	否	商户订单号
            3	orderType	String	否	订单类型
            4	mailNo	String	否	顺丰运单号
            5	mainMailNo	String	否	顺丰运单号-母单号
            6	subMailNo	String	否	顺丰运单号-子单号
            7	dMobile	String	否	收件手机
            8	dTel	String	否	收件人电话
            9	dAddress	String	否	收件详细地址
            10	expressType	String	否	业务类型
            11	payMethod	String	否	运费付款方式
            12	packagesNo	String	否	件数
            13	depositumInfo	String	否	托寄物内容
            14	depositumNo	String	否	托寄物数量
            15	packStandardMoney	String	否	标准包装金额
            16	packIndividuationMoney	String	否	个性化包装金额
            17	parcelWeighs	String	否	包裹重量
            18	supportValue	String	否	保价金额
            19	remark	String	否	寄方备注
            20	custid	String	否	顺丰月结卡号
            21	returnTrackingNo	String	否	顺丰签回单服务运单号
            22	receipt	String	否	签回单操作要求
            23	sendState	String	否	派送状态
            24	isLogo	String	否	是否使用LOGO（0否，1是）
            25	isPrint	String	否	是否直接复印（0否，1是）
            26	origincode	String	否	原寄地区域代码
            27	destcode	String	否	目的地区域代码
            28	sourceTransferCode	String	否	原寄地中转场
            29	sourceCityCode	String	否	原寄地城市代码
            30	sourceDeptCode	String	否	原寄地网点代码
            31	sourceTeamCode	String	否	原寄地单元区域
            32	destCityCode	String	否	目的地城市代码,eg:755
            34	destDeptCode	String	否	目的地网点代码,eg:755AQ
            35	destDeptCodeMapping	String	否	目的地网点代码映射码
            36	destTeamCode	String	否	目的地单元区域,eg:001
            37	destTeamCodeMapping	String	否	目的地单元区域映射码
            38	destTransferCode	String	否	目的地中转场
            39	destRouteLabel	String	否	打单时的路由标签信息
            40	proName	String	否	产品名称
            41	cargoTypeCode	String	否	快件内容：如：C816、SP601
            42	limitTypeCode	String	否	时效代码, 如：T4
            43	expressTypeCode	String	否	产品类型,如：B1
            44	codingMapping	String	否	入港映射码 eg:S10
            45	codingMappingOut	String	否	出港映射码
            46	xbFlag	String	否	XB标志 0:不需要复印XB , 1:需要复印XB
            47	printFlag	String	否	复印标志
            48	twoDimensionCode	String	否	二维码
            49	proCode	String	否	时效类型:值为二维码中的K4
            50	printIcon	String	否	复印图标
            51	abFlag	String	否	AB标
            52	errMsg	String	否	查询出现异常时返回信息。返回代码：0 系统异常;1 未找到运单
            53	destPortCode	String	否	目的地口岸代码
            54	destCountry	String	否	目的国别(国别代码如：JP)
            55	destPostCode	String	否	目的地邮编
            56	goodsValueTotal	String	否	总价值(保留两位小数，数字类型，可补位)
            57	currencySymbol	String	否	币种
            58	goodsNumber	String	否	丰桥返回复印信息-件数
            59	cost	String	否	费用合计
            60	addService	String	否	增值服务
            61	waybillType	String	否	运单类型：1-普通运单 2-子母件 3-签回单
            62	topText	String	否	顶部信息：复印时间等
            63	orderSort	String	否	订单顺序：对应条形码左侧的 M/N，如 1/2
            64	templateName	String	否	复印模板：前端根据名称判断
            65	isCollection	String	否	是否代收货款
            66	isReceipt	String	否	是否签回单
            67	showOrderid	String	否	是否显示订单号（0否1是）
            68	orderBarCode	String	否	是否显示订单号条形码（0否1是）
            69	printIndex	String	否	复印批次号
            70	printNumber	String	否	打印次数
            71	jAddress	String	否	寄件详细地址
            72	jContact	String	否	寄件人
            73	jTel	String	否	寄件电话
            74	dContact	String	否	收件人
            75	jCompany	String	否	寄件公司
            76	dCompany	String	否	收件公司
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "message": null,
                "code": "SUCCESS",
                "result": [
                    {
                        "orderId": "ZLHD000001N5226688372",
                        "merchantOrderNo": null,
                        "orderType": null,
                        "mailNo": "SF1040364526174",
                        "mainMailNo": "SF1040364526174",
                        "subMailNo": null,
                        "dMobile": null,
                        "dTel": "15986618684",
                        "dAddress": "广东省深圳市龙华新区白石龙一区175栋",
                        "expressType": "1",
                        "payMethod": "寄付",
                        "packagesNo": "1",
                        "depositumInfo": "西瓜",
                        "depositumNo": "3",
                        "packStandardMoney": null,
                        "packIndividuationMoney": null,
                        "parcelWeighs": null,
                        "supportValue": null,
                        "remark": "备注啊",
                        "custid": "",
                        "returnTrackingNo": null,
                        "receipt": null,
                        "sendState": null,
                        "isLogo": null,
                        "isPrint": null,
                        "origincode": null,
                        "destcode": null,
                        "sourceTransferCode": null,
                        "sourceCityCode": "021",
                        "sourceDeptCode": null,
                        "sourceTeamCode": null,
                        "destCityCode": "755",
                        "destDeptCode": "755BE",
                        "destDeptCodeMapping": "755W-D7",
                        "destTeamCode": "755FTL001",
                        "destTeamCodeMapping": null,
                        "destTransferCode": "755",
                        "destRouteLabel": "755BE-FTL001",
                        "proName": null,
                        "cargoTypeCode": "C201",
                        "limitTypeCode": "T4",
                        "expressTypeCode": "B1",
                        "codingMapping": "D7",
                        "codingMappingOut": "3A",
                        "xbFlag": "0",
                        "printFlag": "000000000",
                        "twoDimensionCode": "MMM={'k1':'755','k2':'755BE','k3':'755FTL001','k4':'T4','k5':'SF1040364526174','k6':'','k7':'1244d871'}",
                        "proCode": "T4",
                        "printIcon": "00100000",
                        "abFlag": null,
                        "errMsg": null,
                        "destPortCode": null,
                        "destCountry": null,
                        "destPostCode": null,
                        "goodsValueTotal": null,
                        "currencySymbol": null,
                        "goodsNumber": null,
                        "cost": "",
                        "addService": "",
                        "waybillType": "1",
                        "topText": "2021-04-14 15:00:29",
                        "orderSort": "1/1",
                        "templateName": null,
                        "isCollection": null,
                        "isReceipt": null,
                        "showOrderid": 1,
                        "orderBarCode": null,
                        "printIndex": "202104141500-3419-1",
                        "printNumber": 0,
                        "dcontact": "梁飞",
                        "daddress": "广东省深圳市龙华新区白石龙一区175栋",
                        "jtel": "15113149999",
                        "dtel": "15986618684",
                        "jcontact": "佩奇",
                        "jaddress": "上海市上海市黄浦区中山大道",
                        "jcompany": null,
                        "dcompany": null,
                        "dmobile": null
                    }
                ]
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_LIST_PRINT_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsListPrintInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 清单运费查询接口
        /// 清单运费查询接口，只有包裹被揽收以后才能调用;
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsSFWaybill(string partnerID, string checkword, MsgDataRequestMrdsSFWaybill data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            清单运费查询接口，只有包裹被揽收以后才能调用;

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_SFWAYBILL
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> QuerySfWaybillDTO
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	waybillNo	String	否		运单号
            3	type	Long	否		1:表示按订单查询 ; 2:表示按运单查询
            4	orderId	String	是		订单号
            5	phone	String	否		校验手机号
            6	monthlyCardNo	String	否		月结卡号
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000009",
                "type": "2",
                "waybillNo": "SF1011636105225",
                "orderId": "xa1xfdccc54313311415123631",
                "phone": "15113149999"
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	SfWaybillResult	否	保费
            2.4. 元素<响应> Response/SfWaybillResult
            #	属性名	类型(约束)	必填	描述
            1	meterageWeightQty	String	否	返回计费重
            2	orderId	String	否	订单id
            3	fee	Fee	否	费用
            4	limitTypeCode	String	否	返回时效类型
            5	addresseeAddr	String	否	收件详细地址
            6	customerAcctCode	String	否	返回月结帐号
            7	cargoTypeCode	String	否	快件内容编码
            8	productName	String	否	产品名称
            9	consignorAddr	String	否	寄件详细地址
            10	consignorPhone	String	否	件电话
            11	consignedTm	String	否	寄件时间,格式指定为: yyyy-MM-dd hh:mm:ss
            12	result	String	否	业务订单号
            13	waybillChilds	String	否	返回子单号,多个英文逗号分隔
            14	addresseeContName	String	否	收件联系人
            15	sourceZoneCode	String	否	业务订单号
            16	addresseeMobile	String	否	收件手机
            17	expressTypeCode	String	否	产品类型
            18	shieldFlg	String	否	
            19	consignorContName	String	否	寄件联系人
            20	destZoneCode	String	否	目的地区域代码
            21	consignorMobile	String	否	寄件人电话
            22	waybillNo	String	否	运单号
            2.5. 元素<响应> Response/SfWaybillResult/Fee
            #	属性名	类型(约束)	必填	描述
            1	type	String	否	费用类型
            2	name	String	否	费用名称
            3	value	String	否	费用金额
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "message": null,
                "code": "SUCCESS",
                "result": {
                    "meterageWeightQty": "1.0",
                    "orderId": "xa1xfdccc54313311415123631",
                    "fee": [
                        {
                            "name": "运费",
                            "type": "1",
                            "value": "45.0"
                        }
                    ],
                    "limitTypeCode": "T4",
                    "addresseeAddr": "广东省深圳市龙华新区白石龙一区175栋",
                    "consignorAddr": "上海市黄浦区中山大道",
                    "consignorPhone": "15113149999",
                    "result": "ok",
                    "addresseeContName": "梁飞",
                    "addresseeMobile": "15986618684",
                    "expressTypeCode": "B1",
                    "consignorContName": "佩奇",
                    "consignorMobile": "15113149999",
                    "waybillNo": "SF1334445767694"
                }
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_SFWAYBILL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsSFWaybill>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 路由查询接口
        /// 路由查询接口：适用于给用户进行单次物流信息查询，如果系统需要实时更新路由状态，请对接“4.路由回调接口”
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsRoute(string partnerID, string checkword, MsgDataRequestMrdsRoute data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            路由查询接口：适用于给用户进行单次物流信息查询，如果系统需要实时更新路由状态，请对接“4.路由回调接口”

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_ROUTE
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> QueryOrderRouteDTO
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	orderNo	String	是		订单号
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000009",
                "orderNo": "1231232"
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	List<RouteInfo>	否	保费
            2.4. 元素<响应> Response/RouteInfo
            #	属性名	类型(约束)	必填	描述
            1	mailno	String	否	运单号
            2	accept_address	String	否	路由到达地址
            3	accept_date	String	否	路由日期
            4	remark	String	否	备注
            5	opcode	String	否	操作码
            6	accept_time	String	否	路由时间
            7	accept_totaltime	String	否	路由详细时间
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "message": null,
                "code": "SUCCESS",
                "result": [
                    {
                        "mailno": "SF1334445767694",
                        "accept_address": "深圳市",
                        "accept_date": "2021-04-14",
                        "remark": "在官网\"运单资料&签收图\",可查看签收人信息",
                        "opcode": "8000",
                        "accept_time": "16:35:51",
                        "accept_totaltime": "2021-04-14 16:35:51"
                    },
                    {
                        "mailno": "SF1334445767694",
                        "accept_address": "深圳市",
                        "accept_date": "2021-04-14",
                        "remark": "您的快件已签收，如有疑问请电联快递员【212，电话：+8618588259494】。疫情期间顺丰每日对网点消毒、快递员每日测温、配戴口罩，感谢您使用顺丰，期待再次为您服务。（主单总件数：1件）",
                        "opcode": "80",
                        "accept_time": "16:35:50",
                        "accept_totaltime": "2021-04-14 16:35:50"
                    },
                    {
                        "mailno": "SF1334445767694",
                        "accept_address": "深圳市",
                        "accept_date": "2021-04-14",
                        "remark": "快件在【深圳福田天安营业部】完成分拣,准备发往下一站",
                        "opcode": "30",
                        "accept_time": "16:34:05",
                        "accept_totaltime": "2021-04-14 16:34:05"
                    },
                    {
                        "mailno": "SF1334445767694",
                        "accept_address": "深圳市",
                        "accept_date": "2021-04-14",
                        "remark": "顺丰速运 已收取快件",
                        "opcode": "50",
                        "accept_time": "16:33:46",
                        "accept_totaltime": "2021-04-14 16:33:46"
                    }
                ]
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_ROUTE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsRoute>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 实时温度查询接口
        /// 获取运单实时温度，仅适用于使用了温控追溯（实时）增值服务的订单;
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsTemperature(string partnerID, string checkword, MsgDataRequestMrdsTemperature data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            获取运单实时温度，仅适用于使用了温控追溯（实时）增值服务的订单;

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_TEMPERATURE
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> OrderThirdTemperatureDTO
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	expressList	String[]	是		运单号列表
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000009",
                "expressList": [
                    "SF1334445767694",
                    "SF7001200997791",
                    "SF7001200997792"
                ]
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	TemperatureResult	否	相应结果
            2.4. 元素<响应> Response/TemperatureResult
            #	属性名	类型(约束)	必填	描述
            1	expressNo	String	否	运单号
            2	deviceCode	String	否	设备编码
            3	recordTime	String	否	上报时间
            4	sensorValue	String	否	温度值
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "message": null,
                "code": "SUCCESS",
                "result": [
                    {
                        "expressNo": "SF1334445767694",
                        "deviceCode": "96121578",
                        "recordTime": 1589983409087,
                        "sensorValue": "5.8"
                    },
                    {
                        "expressNo": "SF7001200997791",
                        "deviceCode": "96121578",
                        "recordTime": 1589983409087,
                        "sensorValue": "5.8"
                    },
                    {
                        "expressNo": "SF7001200997792",
                        "deviceCode": "96121578",
                        "recordTime": 1589983409087,
                        "sensorValue": "5.8"
                    }
                ]
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_TEMPERATURE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsTemperature>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 订单详情接口
        /// 查询包裹保费
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsOrderDetail(string partnerID, string checkword, MsgDataRequestMrdsOrderDetail data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            查询包裹保费

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_ORDER_DETAIL
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> PremiumQueryDTO
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	orderNo	String	是		订单编号
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000009",
                "orderNo": "xa1xfdccc543133114asd3631"
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	OrderInfo	否	订单详情
            2.4. 元素<响应> Response/OrderInfo
            #	属性名	类型(约束)	必填	描述
            1	id	String	否	订单号
            2	bspOrderNo	String	否	BSP订单号
            3	orderDate	String	否	下单时间
            4	orderStatus	Integer	否	订单状态【7待发货，8待收货，10已完成，11交易关闭】
            5	payMethod	String	否	运费付款方式
            6	expressType	String	否	使用的顺丰产品类型 标快或同城
            7	hospitalId	String	否	医院id
            8	hospitalCode	String	否	医院代码
            9	businessCode	String	否	业务CODE
            10	businessName	String	否	业务名称
            11	productCode	String	否	产品code
            12	patientName	String	否	患者姓名
            13	patientPhone	String	否	患者电话
            14	patientIdentityCardNo	String	否	患者身份证号
            15	srcName	String	否	寄件人姓名
            16	srcPhone	String	否	寄件人电话
            17	srcProvince	String	否	寄件人省份
            18	srcCity	String	否	寄件人城市
            19	srcDistrict	String	否	寄件人镇区
            20	srcAddress	String	否	寄件人详细地址
            21	srcCompany	String	否	寄件公司
            22	destName	String	否	收件人姓名
            23	destProvince	String	否	收件人省份
            24	destCity	String	否	收件人城市
            25	destDistrict	String	否	收件人镇区
            26	destAddress	String	否	收件人详细地址
            27	destPhone	String	否	收件人电话
            28	parcelWeighs	String	否	包裹重量
            29	packagesNo	String	否	件数
            30	depositumInfo	String	否	寄托物内容
            31	depositumNo	String	否	寄托物数量
            32	creatorUser	String	否	创建人
            33	createTm	String	否	创建时间
            34	mailTime	String	否	运单时间
            35	mailNo	String	否	运单号
            36	remark	String	否	备注
            37	monthlyCard	String	否	月结卡号
            38	callFlag	String	否	是否下call 0:不下call 1:下call
            39	sendStartTime	String	否	下call时间/上门取件时间
            40	orderTaskFlag	String	否	下微派任务：1 下单任务; 否则不下单
            41	orderTaskCode	String	否	微派产品编码：需要在微派配置
            42	verifyCode	String	否	微派核销码：某些产品编码需要
            43	signFlag	String	否	是否需要口令签收
            44	expressCost	String	否	快递费
            45	statementValue	String	否	声明价值
            46	packIndividuationMoney	String	否	个性化包装金额
            47	collectionMoney	String	否	代收金额
            48	collectionNo	String	否	代收卡号
            49	hospitalAreaName	String	否	医院所属地区部名称
            50	hospitalAreaCode	String	否	医院所属地区部编码
            51	printNumber	String	否	打印次数
            52	orderFinishDate	String	否	订单完成时间yyyy-MM-dd HH:mm:ss
            53	merchantOrderNo	String	否	客户订单编号
            54	directOrderMerchantType	String	否	直联下单业务渠道
            55	needHandover	String	否	是否需要交接,0-不需要，1-需要
            56	prescriptionNos	String	否	客户处方单号,如有多个处方单号则用逗号拼接
            57	deliveryMethod	String	否	配送方式,0-常温，1-温控
            58	updateCountry	String	否	转寄修改后的国家
            59	updateCountryCode	String	否	转寄修改后的国家编码
            60	updateProvince	String	否	转寄修改后的省
            61	updateCity	String	否	转寄修改后的市
            62	updateCounty	String	否	转寄修改后的区
            63	updateAddress	String	否	转寄修改后的详细地址
            64	updateAcontact	String	否	转寄修改后的联系人姓名
            65	updatePhone	String	否	转寄修改后的收件人电话
            66	updateAreaCode	String	否	转寄修改后的网点代码
            67	needReturnTrackingNumber	String	否	是否返回签回单（签单返还）的运单号，支持以下值： 1：要求 其它为不要求
            68	returnTrackingNo	String	否	签回单号
            69	needTemperatureRetrospect	String	否	是否需要温度追溯(离线)增值服务,1-需要，其他为不需要
            70	needTemperatureMonitoring	String	否	是否需要温度追溯（实时）增值服务,1-需要，0-不需要（默认）
            71	expressTypeName	String	否	顺丰产品名称
            72	orderTaskStatusName	String	否	微派下单结果： 订单状态
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success":true,
                "message":null,
                "code":"SUCCESS",
                "result":{
                    "hospitalAreaName":"北京分部",
                    "srcName":"佩奇",
                    "depositumNo":"3",
                    "businessName":"直连下单",
                    "businessCode":"DIRECT_PLACE_ORDER",
                    "createTm":"2021-04-26 16:59:59",
                    "orderTaskCode":"",
                    "payMethod":1,
                    "destAddress":"白石龙一区175栋",
                    "id":"ZLHD000001NI423265507",
                    "expressType":"1",
                    "destCity":"深圳市",
                    "srcAddress":"中山大道",
                    "merchantOrderNo":"xa1xfdccc543133114asd3631",
                    "packagesNo":1,
                    "orderDate":"2021-04-26 16:59:59",
                    "signFlag":false,
                    "destName":"梁飞",
                    "callFlag":"0",
                    "deliveryMethod":0,
                    "mailTime":"2021-04-26 17:00:00",
                    "orderStatus":7,
                    "sendStartTime":"2020-10-19 09:19:35",
                    "remark":"备注啊",
                    "hospitalCode":"HD000001",
                    "mailNo":"SF2104261608257",
                    "srcProvince":"上海市",
                    "bspOrderNo":"ZLHD000001NI423265507",
                    "hospitalId":1,
                    "parcelWeighs":"10",
                    "srcPhone":"15113149999",
                    "patientName":"佩奇",
                    "destDistrict":"龙华新区",
                    "destPhone":"15986618684",
                    "depositumInfo":"西瓜",
                    "srcCity":"上海市",
                    "srcDistrict":"黄浦区",
                    "orderTaskFlag":0,
                    "hospitalName":"小微复旦大学附属肿瘤医院",
                    "patientPhone":"15113149999",
                    "destProvince":"广东省",
                    "printNumber":0,
                    "productCode":"MEDICAL_CHART",
                    "patientIdentityCardNo":"411081199102201259",
                    "monthlyCard":"",
                    "hospitalAreaCode":"BJ"
                }
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_ORDER_DETAIL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsOrderDetail>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 获取运单温湿度接口
        /// 查询运单温湿度，只有开通了IN130温度追溯（离线）增值服务的订单才能使用此接口，该接口只有在订单完结之后才能查询到数据;
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsHumiture(string partnerID, string checkword, MsgDataRequestMrdsHumiture data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            查询运单温湿度，只有开通了IN130温度追溯（离线）增值服务的订单才能使用此接口，该接口只有在订单完结之后才能查询到数据;

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_HUMITURE
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> OrderNoDTO
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	mailNo	String	是		运单号
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000009",
                "mailNo": "SF7001200997790"
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	Humitures	否	操作结果
            2.4. 元素<响应> Response/HumituresResult
            #	属性名	类型(约束)	必填	描述
            1	code	String	否	响应编码200：成功
            2	data	HumituresData	否	Gps 信息
            3	message	String	否	返回消息描述
            2.4. 元素<响应> Response/HumituresResult/HumituresData
            #	属性名	类型(约束)	必填	描述
            1	waybillHumitures	List<WaybillHumiture>	否	运单温湿度信息
            2	resultMessage	String	否	响应消息
            3	waybillState	String	否	运单状态
            2.5. 元素<响应> Response/HumituresResult/HumituresData/WaybillHumiture
            #	属性名	类型(约束)	必填	描述
            1	bindingType	String	否	绑定类型
            2	record_date	String	否	记录日期(yyyy-MM-dd HH:mm:ss)
            3	kid	String	否	
            4	latitude	String	否	
            5	device_no	String	否	设备编码
            6	electric_quantity	String	否	
            7	attachedInfo	String	否	
            8	lux	String	否	
            9	sensorId	String	否	
            10	summarizedColdSignal	SummarizedColdSignal	否	温度数据
            11	lineCode	String	否	线路编码
            12	total	long	否	总记录数
            13	received_date	String	否	接收日期(yyyy-MM-dd HH:mm:ss)
            14	asset_code	String	否	资产编码
            15	sensorType	String	否	
            16	temperature	Float	否	温度
            17	humidity	Float	否	湿度
            18	create_date	String	否	创建时间(yyyy-MM-dd HH:mm:ss)
            19	gateWay	String	否	
            20	sensorValue	String	否	
            21	longitude	String	否	
            2.6. 元素<响应> Response/HumituresResult/HumituresData/WaybillHumiture/SummarizedColdSignal
            #	属性名	类型(约束)	必填	描述
            1	maxTemperature	float	否	最高温度
            2	newHumidity	float	否	数据
            3	device_no	String	否	
            4	avgHumidity	float	否	平均湿度
            5	minHumidity	float	否	最低湿度
            6	newRecordDate	String	否	
            7	asset_code	String	否	
            8	minTemperature	float	否	最低温度
            9	sensorType	String	否	
            10	newLatitude	String	否	
            11	newLongitude	String	否	
            12	maxHumidity	float	否	最高湿度
            13	newTemperature	String	否	
            14	avgTemperature	float	否	平均温度
            15	sensorValue	String	否	
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "message": null,
                "code": "SUCCESS",
                "result": {
                    "code": "200",
                    "data": {
                        "waybillHumitures": [
                            {
                                "bindingType": "2",
                                "record_date": "2019-12-13 20:30:00",
                                "kid": "0efe49438174488ea8b7da122d49c6f7",
                                "latitude": null,
                                "device_no": "HS500BQ18C",
                                "electric_quantity": null,
                                "attachedInfo": "M531LKWA",
                                "lux": null,
                                "sensorId": 1,
                                "summarizedColdSignal": {
                                    "maxTemperature": 6.3,
                                    "newHumidity": 72.5,
                                    "device_no": null,
                                    "avgHumidity": 70.513596,
                                    "minHumidity": 64.9,
                                    "newRecordDate": "2019-12-19 08:30:00",
                                    "asset_code": null,
                                    "minTemperature": 3,
                                    "sensorType": null,
                                    "newLatitude": null,
                                    "newLongitude": null,
                                    "maxHumidity": 75.69,
                                    "newTemperature": 3.9,
                                    "avgTemperature": 5.281056,
                                    "sensorValue": null
                                },
                                "lineCode": null,
                                "total": 0,
                                "received_date": "2019-12-13 20:30:27",
                                "asset_code": "955990269286",
                                "sensorType": "temperature",
                                "temperature": 5,
                                "humidity": 64.9,
                                "create_date": "2019-12-13 20:30:27",
                                "gateWay": null,
                                "sensorValue": 5,
                                "longitude": null
                            },
                            {
                                "bindingType": "3",
                                "record_date": "2019-12-13 20:33:00",
                                "kid": "24aa4fbbb548483590103466d1c4b67a",
                                "latitude": "36.7931359",
                                "device_no": "80117092",
                                "electric_quantity": "89",
                                "attachedInfo": "粤AD11W4",
                                "lux": null,
                                "sensorId": 1,
                                "summarizedColdSignal": null,
                                "lineCode": "M531LKWAM531CKA2340",
                                "total": 0,
                                "received_date": "2019-12-13 20:33:12",
                                "asset_code": "955990258003",
                                "sensorType": "temperature",
                                "temperature": 4.8,
                                "humidity": null,
                                "create_date": "2019-12-13 20:33:12",
                                "gateWay": null,
                                "sensorValue": 4.8,
                                "longitude": "117.215196"
                            },
                            {
                                "bindingType": "3",
                                "record_date": "2019-12-13 20:38:00",
                                "kid": "7a06d17e41d947369d617b548d9697f8",
                                "latitude": "36.7931359",
                                "device_no": "80117092",
                                "electric_quantity": "89",
                                "attachedInfo": "粤AD11W4",
                                "lux": null,
                                "sensorId": 1,
                                "summarizedColdSignal": null,
                                "lineCode": "M531LKWAM531CKA2340",
                                "total": 0,
                                "received_date": "2019-12-13 20:38:22",
                                "asset_code": "955990258003",
                                "sensorType": "temperature",
                                "temperature": 4.8,
                                "humidity": null,
                                "create_date": "2019-12-13 20:38:22",
                                "gateWay": null,
                                "sensorValue": 4.8,
                                "longitude": "117.215196"
                            },
                            {
                                "bindingType": "3",
                                "record_date": "2019-12-13 20:43:00",
                                "kid": "8db9fd5392e1497c85f3c00b6891bc6e",
                                "latitude": "36.802135468",
                                "device_no": "80117092",
                                "electric_quantity": "87",
                                "attachedInfo": "粤AD11W4",
                                "lux": null,
                                "sensorId": 1,
                                "summarizedColdSignal": null,
                                "lineCode": "M531LKWAM531CKA2340",
                                "total": 0,
                                "received_date": "2019-12-13 20:43:15",
                                "asset_code": "955990258003",
                                "sensorType": "temperature",
                                "temperature": 4.7,
                                "humidity": null,
                                "create_date": "2019-12-13 20:43:15",
                                "gateWay": null,
                                "sensorValue": 4.7,
                                "longitude": "117.19455719"
                            }
                        ],
                        "resultMessage": "success",
                        "waybillState": "0"
                    },
                    "message": "查询运单号温湿度"
                }
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_HUMITURE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsHumiture>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 微派任务结果查询接口
        /// 用于主动查询微派任务订单的状态和结果。 （如果没有微派任务的状态回调则 status= null）
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult MrdsWpTaskResult(string partnerID, string checkword, MsgDataRequestMrdsWpTaskResult data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            用于主动查询微派任务订单的状态和结果。 （如果没有微派任务的状态回调则 status= null）

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_MRDS_WP_TASK_RESULT
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<请求> OrderNoDTO
            #	属性名	类型(约束)	必填	默认值	描述
            1	hospitalCode	String(16)	是		医院编码
            2	orderNo	String	是		业务订单号
            请求报文（msgData字段）:

            {
                "hospitalCode": "LAAS000009",
                "orderNo": "lfcs543133415123613"
            }
            2.3. 元素<响应> Response
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	响应结果：true 成功； false 失败
            2	message	String(1000)	否	结果描述
            3	code	String(1000)	否	响应编码
            4	result	WeiPaiResutl	否	操作结果
            2.4. 元素<响应> Response/WeiPaiResutl
            #	属性名	类型(约束)	必填	描述
            1	resourceUrls	String[]	否	任务结果的下载地址
            2	status	String	否	订单的状态：订单状态： 0 待接单 ；1 处理中； 2 待审核 ； 3 异常 ；4 已完成； 5 已取消； 6 异常退出； 7 失败；8 失败完成； 9 终止
            2.5. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "message": null,
                "code": "SUCCESS",
                "result": {
                    "resourceUrls": [
                        "http://mrds-admin.sit.sf-express.com:45452/api/file/commonDownload/taskResult1.jpg",
                        "http://mrds-admin.sit.sf-express.com:45452/api/file/commonDownload/taskResult2.jpg"
                    ],
                    "status": 4
                }
            }
            查询失败:
            {
                "success": false,
                "message": "医院不存在,请提供正确的[hospitalCode]参数",
                "code": "MRDS_ERROR",
                "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_MRDS_WP_TASK_RESULT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseMrdsWpTaskResult>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 路由信息推送接口 COM_PUSH_MRDS_ROUTE 
        /// 路由推送。当路由信息生产后向客户主动推送要求的顺丰运单路由信息；
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData"></param>
        /// <returns></returns>
        public static string PushMrdsRoute(string body, out MsgDataRequestPushMrdsRoute msgData)
        {
            /*
            1. 功能描述
            路由推送。当路由信息生产后向客户主动推送要求的顺丰运单路由信息；

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_PUSH_MRDS_ROUTE
            批量交易	不支持
            接口类型	推送
            报文类型	HTTP /HTTPS POST Content_type:application/x-www-form-urlencoded; Charset=utf-8
            2.2. 元素<请求> params
            参数列表	类型	是否必传	含义
            logisticID	String(20)	Y	物流公司代码，SF代表顺丰
            requestID	String(40)	Y	请求唯一号UUID
            serviceCode	String(50)	Y	接口服务代码 此处为面单推送接口服务码
            timestamp	long	Y	调用接口时间戳
            msgDigest	String(128)	Y	数字签名 同CP请求SF的加密方式相同
            msgData	String	Y	业务数据报文
            nonce	String	N	调用接口随机数
            2.3 元素<请求>msgData
            #	属性名	类型(约束)	必填	默认值	描述
            1	id	String	是		路由的ID
            2	mailNo	String	是		运单号
            3	orderId	String	是		订单号
            4	acceptTime	String	是		路由节点发生的时间（时间戳）
            5	acceptAddress	String	是		路由节点发生的城市
            6	remark	String	是		路由节点具体描述
            7	opCode	String	是		路由节点操作码
            2.4. 元素<响应> Response
            返回 “success” 字符串表示成功

            2.5. 相应示例
            响应报文:

            成功响应:
            “success”

            推送失败:
            “failure” 
            */
            string result = "failure";
            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<PushMrdsRouteRequest>(body);
                if (reqData != null)
                {
                    msgData = JsonHelper.DeserializeObject<MsgDataRequestPushMrdsRoute>(reqData.msgData);
                    result = "success";
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return result;
        }

        /// <summary>
        /// 订单状态推送接口  COM_PUSH_MRDS_ORDER_STATUS 
        /// 订单状态回调接口
        /// 当订单状态发生改变后向客户主动推送信息；推送下call到揽收这个过程的订单信息
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData"></param>
        /// <returns></returns>
        public static string PushMrdsOrderStatus(string body, out MsgDataRequestPushMrdsOrderStatus msgData)
        {
            /*
            1. 功能描述
            当订单状态发生改变后向客户主动推送信息；推送下call到揽收这个过程的订单信息

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_PUSH_MRDS_ORDER_STATUS
            批量交易	不支持
            接口类型	推送
            报文类型	HTTP /HTTPS POST Content_type:application/x-www-form-urlencoded; Charset=utf-8
            2.2. 元素<请求> params
            参数列表	类型	是否必传	含义
            logisticID	String(20)	Y	物流公司代码，SF代表顺丰
            requestID	String(40)	Y	请求唯一号UUID
            serviceCode	String(50)	Y	接口服务代码 此处为面单推送接口服务码
            timestamp	long	Y	调用接口时间戳
            msgDigest	String(128)	Y	数字签名 同CP请求SF的加密方式相同
            msgData	String	Y	业务数据报文
            nonce	String	N	调用接口随机数
            2.3 元素<请求>msgData
            #	属性名	类型(约束)	必填	默认值	描述
            1	orderNo	String(16)	是		客户订单号
            2	waybillNo	String	是		顺丰运单号
            3	orderStateCode	String	是		订单状态
            4	orderStateDesc	String	是		订单状态描述
            5	empCode	String	是		收件员工工号
            6	empPhone	String	是		收件员手机号
            7	netCode	String	是		网点
            8	lastTime	String	是		最晚上门时间
            9	bookTime	String	是		客户预约时间
            10	carrierCode	String	是		承运商代码(SF)
            11	createTm	String	是		状态操作时间
            2.4. 元素<响应> Response
            返回 “success” 字符串表示成功

            2.5. 响应示例
            响应报文:

            成功响应:
            “success”

            推送失败:
            “failure”
            */
            string result = "failure";
            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<PushMrdsOrderStatusRequest>(body);
                if (reqData != null)
                {
                    msgData = JsonHelper.DeserializeObject<MsgDataRequestPushMrdsOrderStatus>(reqData.msgData);
                    result = "success";
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return result;
        }

        /// <summary>
        /// 微派任务订单状态推送接口  COM_PUSH_MRDS_WP_STATUS 
        /// 用于微派任务订单状态回调， 告诉客户当前微派任务的状态和结果信息
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData"></param>
        /// <returns></returns>
        public static string PushMrdsWpStatus(string body, out MsgDataRequestPushMrdsWpStatus msgData)
        {
            /*
            1. 功能描述
            用于微派任务订单状态回调， 告诉客户当前微派任务的状态和结果信息

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_PUSH_MRDS_WP_STATUS
            批量交易	不支持
            接口类型	推送
            报文类型	HTTP /HTTPS POST Content_type:application/x-www-form-urlencoded; Charset=utf-8
            2.2. 元素<请求> params
            参数列表	类型	是否必传	含义
            logisticID	String(20)	Y	物流公司代码，SF代表顺丰
            requestID	String(40)	Y	请求唯一号UUID
            serviceCode	String(50)	Y	接口服务代码 此处为面单推送接口服务码
            timestamp	long	Y	调用接口时间戳
            msgDigest	String(128)	Y	数字签名 同CP请求SF的加密方式相同
            msgData	String	Y	业务数据报文
            nonce	String	N	调用接口随机数
            2.3 元素<请求>msgData
            #	属性名	类型(约束)	必填	默认值	描述
            1	merchantOrderNo	String(16)	是		客户订单号
            2	contents	String	是		顺丰运单号
            3	status	String	是		订单状态
            2.4. 元素<响应> Response
            返回 “success” 字符串表示成功

            2.5. 响应示例
            响应报文:

            成功响应:
            “success”

            推送失败:
            “failure”
            */
            string result = "failure";
            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<PushMrdsWpStatusRequest>(body);
                if (reqData != null)
                {
                    msgData = JsonHelper.DeserializeObject<MsgDataRequestPushMrdsWpStatus>(reqData.msgData);
                    result = "success";
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return result;
        }

        #endregion 医寄通服务类接口

        #region 快递管家服务类接口

        /// <summary>
        /// 快递管家下订单接口-内陆件
        /// 顺丰快递管家内陆件企业订单创建
        /// 该接口用于:
        /// ● 客户系统向顺丰快递管家下发订单（内陆件）。
        /// ● 快递管家为订单分配运单号。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EpsOrder(string partnerID, string checkword, MsgDataRequestEpsOrder data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            该接口用于:

            ● 客户系统向顺丰快递管家下发订单（内陆件）。

            ● 快递管家为订单分配运单号。

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_EPS_ORDER
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_EPS_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填，不可与accessToken字段同时传参
            签名方法参考：数字签名认证说明
            6	accessToken	String(100)	条件	accessToken,使用OAuth2方式认证时必填，不可与msgDigest字段同时传参
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	字段名	类型	校验规则	必填	描述
            1	orderId	String(64)	不允许重复	否	用户订单号，为空则系统自动生成；不为空则建议自定义订单号前加上客户公司简拼或者英文名称，防止订单号重复
            2	mailno	String(4000)	12位或15位的运单号	否	非自定义运单号，只适用于预分配订单客户。SF+13位数字或12位数字，不为空则按照传输运单号下单
            3	sendStartTime	String(20)	YYYY-MM-DD HH24:MM:SS	否	上门取件时间，非必填，要求上门取件开始时间，格式：YYYY-MM-DD HH24:MM:SS，示例：2012-07-30 09:30:00
            4	jCompany	String(33)	中文或英文，不支持特殊符号	否	寄件公司
            5	jContact	String(33)	只支持中文真实姓名	是	寄件人
            6	jTel	String(20)	数字/-	条件	寄件电话，寄件电话与寄件手机必填其一
            7	jMobile	String(11)	真实手机号	条件	寄件手机，寄件电话与寄件手机必填其一
            8	jProvince	String(30)	寄件方所在省份	否	必须是标准的省名称称谓，如：广东省。如果是直辖市，请直接传北京、上海等。
            9	jCity	String(100)	寄件方所在城市名称	否	必须是标准的城市称谓，如：深圳市。
            10	jAddress	String(200)	寄件详细地址	是	如不传寄件省市时需包含省市区详细地址
            11	dCompany	String(33)	中文或英文，不支持特殊符号	否	收件公司
            12	dContact	String(33)	只支持真实姓名	是	收件人
            13	dTel	String(20)	数字/-	条件	收件电话，收件电话与收件手机必填其一
            14	dMobile	String(11)	真实手机号	条件	收件手机，收件电话与收件手机必填其一
            15	dProvince	String(30)	到件方所在省份	否	必须是标准的省名称称谓，如：广东省。如果是直辖市，请直接传北京、上海等。如果此字段与dCity字段都有值，则直接使用这两个值而不是通过对dAddress进行地址识别获取。为避免地址识别不成功的风险，建议传输此字段。
            16	dCity	String(100)	到件方所在城市名称	否	必须是标准的城市称谓，如：深圳市。如果是直辖市，请直接传北京（或北京市）、上海（或上海市）等。如果此字段与dProvince字段都有值，则直接使用这两个值而不是对dAddress进行地址识别获取。为避免地址识别不成功的风险，建议传输此字段。
            17	dAddress	String(200)	包含省市区详细地址	是	收件详细地址
            18	custid	String(10)	10位数字	条件	顺丰月结卡号，需确认月结卡号是否可用，是否开通对应产品类型
            19	payMethod	String(1)	约定数字	是	运费付款方式，根据实际情况选择一种付款方式：0-寄付月结；1-寄付现结；2-收方付；3-第三方付；
            20	expressType	String(4)	约定数字	是	快件产品类别，传值产品编码，详见《附录-2.快件产品类别表》，只有在商务上与顺丰约定的类别方可使用
            21	packagesNo	String(5)	1~300	否	件数，非必填，包裹件数，一个包裹对应一个运单号，如果是大于1个包裹，则返回则按照子母件的方式返回母运单号和子运单号。填写实际件数限制为1到300之间。默认为1
            22	depositumInfo	String(128)	限长度	是	托寄物内容，按实际托寄物填写，可填写简称（文件、水果等）
            23	depositumNo	String(128)	限数字，1到10万	是	托寄物数量，指每票快件包含的托寄物总数
            24	parcelWeighs	String(16)	限数字，并大于0001	否	包裹重量，订单货物单位重量，包含子母件，单位千克，精确到小数点后3位，跨境件报关需要填写
            25	remark	String(100)	长度限100字符	否	寄方备注
            26	isDoCall	String(1)	数字0或1	否	是否下call，是否通过手持终端通知顺丰收派员上门收件，支持以下值：1-要求；0-不要求；
            27	isReceipt	String(1)	数字0或1	否	是否签回单：0-否；1-是；
            28	receipt	String(100)		条件	签回单要求，当isReceipt=1时可填写，isReceipt=0时填写无效，非必填(目前该字段用于自己打单时用，不会传给上游系统，如需要求小哥知晓，建议传值到寄件备注中)
            29	isSelfGet	String(1)	数字0或1	否	是否自取：0-否；1-是；
            30	fresh	String(1)	数字0或1	否	保鲜服务：0-否；1-是；
            31	supportValue	String(10)	范围：1000~500000000	否	保价金额，如需保价时，填写物品声明价值以原寄地所在区域币种为准，如中国大陆为人民币，香港为港币，保留3位小数。没有保价金额则无需填写，限制在1到50万之间
            32	packIndividuationMoney	String(10)	限数字，大于000元	否	个性化包装金额，非必填，根据实际包装费用收填写，没有个性化包装费用则无需填写
            33	isCollection	String(1)	数字0或1	否	是否代收：0-否；1-是；
            34	collectionMoney	String(10)	未开通额度：500020000000；开通额度：5.000100000.000	条件	代收金额，当isCollection=1时根据实际代收金额填写，isCollection=0时则无需填写
            35	expressBillType	String(2)	数字0或1	否	寄件范围：1-内地互寄；0-港澳台+国际。默认“内地互寄”
            36	personalExpress	String(2)	数字0或1	否	寄件性质：0-个人件；1-企业件。默认“企业件”
            37	creatorUser	String(20)	限长度	否	创建人，如需使用顺丰快递管家进行订单管理，则需要填顺丰快递管家中真实账号，用于订单归属人的判断，否则无要求，如为空，则取公司接口人账号
            38	volume	String(20)	限数字，并大于0000	否	订单货物总体积，单位立方厘米，精确到小数点后3位，会用于计抛(是否计抛具体商务沟通中双方约定)。
            39	passwordSign	String(1)	数字[0/1/2/3]	否	口令签收：0-否；1-口令；2-身份证；3-口令或身份证，签收时二者选其一。默认0
            40	extra	String(200)		否	自定义字段1
            41	customField2	String(200)		否	自定义字段2
            42	productCode	String(200)		否	微派产品编码，下微派单必填，需在快递管家项目维护
            43	passwordSignValue	String(6)	数字[0-9]{6}	条件	当passwordSign字段为2或3时，传入身份证后6位；
            请求报文:

            {
              "orderId":"TEST20200506181000",
              "jCompany":"顺丰速运",
              "jContact":"小丰",
              "jTel":"95338",
              "jProvince":"广东省",
              "jCity":"深圳市",
              "jAddress":"新洲十一街万基商务大厦",
              "dCompany":"顺丰科技",
              "dContact":"小顺",
              "dTel":"4008111111",
              "dProvince":"广东省",
              "dCity":"深圳市",
              "dAddress":"学府路软件产业基地1栋B座",
              "custid":"7551234567",
              "payMethod":"0",
              "expressType":"1",
              "depositumInfo":"手机",
              "depositumNo":"1"
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	字段名	
            类型
            必填	
            字段说明
            描述
            1	msg	String(200)	否	信息	提示信息（如下微派单有异常在此提示）
            2	succ	String(10)	是	状态码	返回成功或失败信息(ok/fail)
            3	result	String(/)	是	数据	数据
            4	orderid	String(64)	是	客户订单号	
            5	mailno	String(4000)	否	顺丰运单号	一个订单只能有一个母单号，如果是子母单的情况，以半角逗号分隔，主单号在第一个位置，如“755123456789，001123456789，002123456789”，可用于顺丰电子面单标签打印。
            6	return_tracking_no	String(30)	否	顺丰签回单服务运单号	
            7	origincode	String(10)	否	原寄地区域代码	可用于顺丰电子面单标签打印。
            8	destcode	String(10)	否	目的地区域代码	可用于顺丰电子面单标签打印。
            9	filter_result	String(2)	否	筛单结果	1-人工确认；2-可收派；3-不可以收派；
            10	remark	String(100)	条件	备注	filter_result=3时必填,不可以收派的原因代码：1-收方超范围；2-派方超范围；3-其它原因；高峰管控提示信息；【数字】:【高峰管控提示信息】(如：4-温馨提示；1-春运延时)
            11	sourceTransferCode	String(60)	否	原寄地中转场	
            12	sourceCityCode	String(60)	否	原寄地城市代码	
            13	sourceDeptCode	String(60)	否	原寄地网点代码	
            14	sourceTeamCode	String(60)	否	原寄地单元区域	
            15	destCityCode	String(60)	否	目的地城市代码	eg:755
            16	destDeptCode	String(60)	否	目的地网点代码	eg:755AQ
            17	destDeptCodeMapping	String(60)	否	目的地网点代码映射码	
            18	destTeamCode	String(60)	否	目的地单元区域	eg:001
            19	destTeamCodeMapping	String(60)	否	目的地单元区域映射码	
            20	destTransferCode	String(60)	否	目的地中转场	
            21	destRouteLabel	String(200)	否	路由标签信息	如果是大网的路由标签,这里的值是目的地网点代码,如果是同城配的路由标签,这里的值是根据同城配的设置映射出来的值,不同的配置结果会不一样,不能根据-符号切分(如:上海同城配,可能是:集散点-目的地网点-接驳点,也有可能是目的地网点代码-集散点-接驳点)
            22	proName	String(60)	否	产品名称	对应RLS:pro_name
            23	cargoTypeCode	String(30)	否	快件内容	如:C816、SP601
            24	limitTypeCode	String(30)	否	时效代码	如:T4
            25	expressTypeCode	String(30)	否	产品类型	如:B1
            26	codingMapping	String(60)	否	入港映射码	eg:S10
            27	codingMappingOut	String(60)	否	出港映射码	
            28	xbFlag	String(30)	否	XB标志	0:不需要打印XB，1:需要打印XB
            29	printFlag	String(60)	否	打印标志	返回值总共有9位,每位只有0和1两种,0表示按丰密面单默认的规则,1是显示,顺序如下,如111110000表示打印寄方姓名、寄方电话、寄方公司名、寄方地址和重量,收方姓名、收方电话、收方公司和收方地址按丰密面单默认规则：1-寄方姓名；2-寄方电话；3-寄方公司名；4-寄方地址；5-重量；6-收方姓名；7-收方电话；8-收方公司名；9-收方地址；
            30	twoDimensionCode	String(600)	否	二维码	根据规则生成字符串信息,格式为MMM={‘k1’:’(目的地中转场代码)’,’k2’:’(目的地原始网点代码)’,’k3’:’(目的地单元区域)’,’k4’:’(附件通过三维码(express_type_code、limit_type_code、 cargo_type_code)映射时效类型)’,’k5’:’(运单号)’,’k6’:’(AB标识)’,’k7’:’(校验码)’}
            31	proCode	String(30)	否	时效类型	值为二维码中的K4
            32	printIcon	String(100)	否	打印图标	根据托寄物判断需要打印的图标(重货,蟹类,生鲜,易碎，Z标)返回值有8位，每一位只有0和1两种，0表示按运单默认的规则，1表示显示。后面两位默认0备用。顺序如下：重货，蟹类，生鲜，易碎，医药类，Z标,酒类，0。如：00000000表示不需要打印重货，蟹类，生鲜，易碎，医药，Z标，酒类，备用
            33	abFlag	String(30)	否	AB标	
            34	errMsg	String(1000)	否	查询出现异常时返回信息	返回代码:0-系统异常；1-未找到面单；
            35	destPortCode	String(100)	否	目的地口岸代码	
            36	destCountry	String(50)	否	目的国别	国别代码如:JP
            37	destPostCode	String(100)	否	目的地邮编	
            38	goodsValueTotal	String(30)	否	总价值	保留两位小数，数字类型，可补位
            39	currencySymbol	String(30)	否	币种	
            40	goodsNumber	String(20)	否	件数	
            41	twoDimensionCode2	String(600)	否	签回单二维码	下单时，当选择签回单增值服务时，会回传此字段，规则同“twoDimensionCode”
            42	newIcon	String(100)	否	ab标扩展	
            43	newAbflag	String(30)	否	打印图标扩展	
            2.6. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
            "msg":"",
            "succ":"ok",
            "result":
              {
                  "orderid":"TEST20200506181000",
                  "mailno":"619428034014",
                  "return_tracking_no":"217100050112",
                  "origincode":"755",
                  "destcode":"755",
                  "filter_result":"2",
                  "remark":"",
                  "sourceTransferCode":"755WF",
                  "sourceCityCode":"755",
                  "sourceDeptCode":"755AQ",
                  "sourceTeamCode":"036",
                  "destCityCode":"755",
                  "destDeptCode":"755AQ",
                  "destDeptCodeMapping":"755WF-S3",
                  "destTeamCode":"036",
                  "destTeamCodeMapping":"755WF-S3",
                  "destTransferCode":"755WF",
                  "destRouteLabel":"755WF-S3",
                  "proName":"顺丰标快",
                  "cargoTypeCode":"C201",
                  "limitTypeCode":"T4",
                  "expressTypeCode":"B1",
                  "codingMapping":"S3",
                  "codingMappingOut":"S3",
                  "xbFlag":"0",
                  "printFlag":"000000000",
                  "twoDimensionCode":"MMM={'k1':'755WF','k2':'755AQ','k3':'036','k4':'T4','k5':'619428034014','k6':'A',k7':'3fc52389'}",
                  "proCode":"T4",
                  "printIcon":"00000000",
                  "abFlag":"A",
                  "newAbflag": null,
                  "newIcon": "00000000"
              }
            }
            失败报文-范例1
            {
                "msg":"系统发生数据错误或运行时异常",
                "result": null,
                "succ": "fail"
            }
            失败报文-范例2
            {
                "msg":"订单号重复导致下单失败",
                "result": null,
                "succ": "fail"
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EPS_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseEpsOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.succ == "ok")
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 路由查询接口-内陆件
        /// 通过顺快递管家内陆件下单后，使用此接口查询对应运单路由
        /// 该接口用于: 客户查询对应顾客编码已下单的订单路由信息。
        /// 注：
        /// 1.只有在路由节点（如小哥扫单）操作后，才会产生路由；
        /// 2.路由查询支持查询3个月内的订单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EpsSearchRoutes(string partnerID, string checkword, MsgDataRequestEpsSearchRoutes data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            该接口用于: 客户查询对应顾客编码已下单的订单路由信息。

            注：
            1.只有在路由节点（如小哥扫单）操作后，才会产生路由；
            2.路由查询支持查询3个月内的订单
            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_EPS_SEARCH_ROUTES
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_EPS_SEARCH_ROUTES）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String(100)	条件	accessToken,使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	字段名	类型	必填	默认值	描述
            1	orderId	String(64)	是		客户订单号
            请求报文:

            {
              "orderid":"b361285847084a1b8c60bb1df9288cfe"
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	字段名	
            类型
            必填	字段说明	描述
            1	msg	String(200)	否	信息	提示信息
            2	succ	String(10)	是	状态码	返回成功或失败信息(ok/fail)
            3	result	String(/)	是	数据	数据（集合），可能为空
            4	mailno	String(64)	是	顺丰运单号	
            5	accept_address	String(64)	否	路由节点发生的地点	
            6	accept_date	String(64)	否	路由发生日期	格式：YYYY-MM-DD
            7	remark	String(64)	否	路由节点具体描述	
            8	opcode	String(64)	否	路由节点操作码	
            9	accept_time	String(64)	否	路由发生时间	格式：HH24:MM:SS
            10	accept_totaltime	String(64)	否	路由节点发生的完整时间	格式：YYYY-MM-DD HH24:MM:SS，示例：2012-7-30 09:30:00
            2.6. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "msg": "",
              "succ": "ok",
              "result": [{
                  "mailno": "SF1040403555959",
                  "accept_address": "北京市",
                  "accept_date": "2021-09-13",
                  "remark": "正在派送途中,请您准备签收(派件人:212,电话:13000002222)",
                  "opcode": "44",
                  "accept_time": "10:24:18",
                  "accept_totaltime": "2021-09-13 10:24:18"
              },
              {
                  "mailno": "SF1040403555959",
                  "accept_address": "北京市",
                  "accept_date": "2021-09-13",
                  "remark": "顺丰速运 已收取快件",
                  "opcode": "50",
                  "accept_time": "10:24:14",
                  "accept_totaltime": "2021-09-13 10:24:14"
              }]
            }
            失败报文-范例1
            {
              "msg":"系统发生数据错误或运行时异常",
              "result": null,
              "succ": "fail"
            }
            失败报文-范例2
            {
              "msg":"路由查询失败",
              "result": null,
              "succ": "fail"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EPS_SEARCH_ROUTES";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseEpsSearchRoutes>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.succ == "ok")
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #region 订单确认/取消接口-内陆件
        /*
        对订单信息进行确认/取消下单
        1. 功能描述
        该接口用于：

        1、客户在下单后，快递员上门揽收前，如需修改部分下单内容（如收件人信息等），可使用此接口进行修改；如不需要修改下单内容，则无需对接此接口。

        注：该操作只能在未揽收前生效；
        2、客户在发货前取消订单。

        注：
        1.订单取消之后，订单号也是不能重复利用的；
        2.该接口只能在未揽收前生效；
        2. 接口定义
        2.1. 接口基本信息
        名称	值
        接口服务代码	COM_RECE_EPS_ORDER_UPDTE
        生产环境地址	https://sfapi.sf-express.com/std/service
        沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
        批量交易	不支持
        接口类型	接入
        报文类型	JSON
        2.2. 公共请求参数
        序号	参数列表	类型	是否必传	含义
        1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
        2	requestID	String(40)	是	请求唯一号UUID
        3	serviceCode	String(50)	是	接口服务代码（COM_RECE_EPS_ORDER_UPDTE）
        4	timestamp	long	是	调用接口时间戳
        5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
        签名方法参考：数字签名认证说明
        6	accessToken	String(100)	条件	accessToken,使用OAuth2方式认证时必填
        获取方法参考：OAuth2认证说明
        7	msgData	String	是	业务数据报文
        2.3. 请求参数<msgData>-订单确认
        序号	字段名	类型（约束）	必填	默认值	描述
        1	orderId	String(64)	是		客户订单号
        2	mailNo	String(20)	条件		顺丰母运单号(如果dealtype=1，必填)
        3	dealType	String(1)	否	1	客户订单操作标识。1：确认；2：取消；3：丰巢柜寄件取消
        4	customsBatchs	String(20)	否		报关批次
        5	agentNo	String(30)	否		代理单号
        6	consignEmpCode	String(20)	否		收派员工号
        7	sourceZoneCode	String(10)	否		原寄地网点代码
        8	inProcessWaybillNo	String(100)	否		头程运单号
        9	isConfirmNew	String(1)	否		改单类型，默认为0。0：旧订单确认；1：新订单确认类型(支持修改收件方信息，含筛单+产品月结校验)
        10	weight	String(10)	否		订单货物总重量，包含子母件，单位千克，精确到小数点后2位，如果提供此值，必须>0。
        11	volume	String(100)	否		货物的总体积（值为长，宽，高），包含子母件，以半角逗号分隔，单位厘米，精确到小数点后2位，会用于计抛（是否计抛具体商务沟通中双方约定）。
        12	returnTracking	String(30)	否		顺丰签回单服务运单号
        13	expressType	String(5)	否		快件产品类别，详见《附录-2.快件产品类别表》，只有在商务上与顺丰约定的类别方可使用。如果此字段为空，则以下单时的为准。
        14	childrenNos	String(1000)	否		子单号（以半角逗号分隔）。当原订单存在子单号时：不修改子单需传订单所有子单号；修改子单传入需要修改的子单号（需是原订单子单号，且只能取消子单，新增子单请使用子单号申请接口）；清除所有子单传空；当原订单不存在子单号时：此字段无用
        15	waybillSize	String(22)	否		电子运单图片规格 1:A4 2:A5
        16	isGenEletricPic	String(1)	否	1	是否生成电子运单图片
        17	bigHousehold	String(1)	否	否	增值服务:大件入户（IN98）：是/否。
        18	superLongOverweight	String(1)	否	否	增值服务：超长超重（IN23）：是/否。
        19	province	String(30)	否		收件方地址-省份
        20	city	String(100)	否		收件方地址-地级行政区名称
        21	county	String(64)	否		收件方地址-县/区级行政区名称
        22	address	String(64)	否		收件方地址-详细地址（需要修改地址时必填）
        23	company	String(100)	否		收件方-公司名称
        24	contact	String(100)	否		收件方-联系人名称
        25	tel	String(20)	否		收件方-联系电话
        26	mobile	String(20)	否		收件方-手机号
        27	extra1	String(200)	否		自定义字段1
        28	extra2	String(200)	否		自定义字段2
        2.4. 请求参数<msgData>-订单取消
        序号	字段名	类型（约束）	必填	默认值	描述
        1	orderId	String(64)	是		客户订单号
        请求报文:

        {
          "orderId":"14dd61d116f64724b4f3dd3ac96950b7",
          "mailno":"SF1310010503902",
          "dealType":1,
          "isConfirmNew":1,
          "weight":3.56,
          "volume":"33,33,33",
          "bigHousehold":2300,
          "province":"北京市",
          "city":"北京市",
          "county":"顺义区",
          "address":"南法信顺捷大厦9层",
          "expressType":2,
          "childrenNos":"SF1344144442021,SF1344144442022,SF1344144442023"
        }
        2.5. 公共响应参数
        序号	属性列表	类型	是否必传	含义
        1	apiResultCode	String(10)	是	API平台结果代码
        2	apiErrorMsg	String(200)	否	API平台异常信息
        3	apiResponseID	String(40)	是	API响应唯一号UUID
        4	apiResultData	String	否	业务处理详细结果
        2.6. 响应参数<apiResultData>-订单确认
        序号	字段名	类型（约束）	必填	
        字段说明
        描述
        1	succ	String (10)	是	状态码	返回成功或失败信息(ok/fail)
        2	msg	String (200)	否	信息	提示信息
        3	result	String (/)	是	数据	数据
        4	orderid	String(64)	是	客户订单号	
        5	mailno	String(20)	条件	顺丰母运单号	如果dealtype=1，必填
        6	code	Number(1)	是	响应状态码	1：客户订单号与顺丰运单不匹配；2 ：操作成功
        7	origincode	String(10)	否	原寄地区域代码	可用于顺丰电子运单标签打印。
        8	destcode	String(10)	否	目的地区域代码	可用于顺丰电子运单标签打印。
        9	filter_result	Number(2)	否	筛单结果	2：可收派
        10	remark	String(100)	条件	高峰管控提示信息	【数字】：【高峰管控提示信息】(如 4：温馨提示 ，1：春运延时)
        11	sourceTransferCode	String(60)	否	原寄地中转场	
        12	sourceCityCode	String(60)	否	原寄地城市代码	
        13	sourceDeptCode	String(60)	否	原寄地网点代码	
        14	sourceTeamCode	String(60)	否	原寄地单元区域	
        15	destCityCode	String(60)	否	目的地城市代码	eg:755
        16	destDeptCode	String(60)	否	目的地网点代码	eg:755AQ
        17	destDeptCodeMapping	String(60)	否	目的地网点代码映射码	
        18	destTeamCode	String(60)	否	目的地单元区域	eg:001
        19	destTeamCodeMapping	String(60)	否	目的地单元区域映射码	
        20	destTransferCode	String(60)	否	目的地中转场	
        21	destRouteLabel	String(200)	否	打单时的路由标签信息	如果是大网的路由标签，这里的值是目的地网点代码；如果是同城配的路由标签，这里的值是根据同城配的设置映射出来的值。不同的配置结果会不一样，不能根据-符号切分（如：上海同城配，可能是：集散点-目的地网点-接驳点，也有可能是目的地网点代码-集散点-接驳点）
        22	proName	String(60)	否	产品名称	对应RLS:pro_name
        23	cargoTypeCode	String(30)	否	快件内容	如：C816、SP601
        24	limitTypeCode	String(30)	否	时效代码	如：T4
        25	expressTypeCode	String(30)	否	产品类型	如：B1
        26	codingMapping	String(60)	否	入港映射码	eg:S10
        27	codingMappingOut	String(60)	否	出港映射码	
        28	xbFlag	String(30)	否	XB标志	0:不需要打印XB；1:需要打印XB
        29	printFlag	String(60)	否	打印标志	返回值总共有9位，每一位只有0和1两种，0表示按丰密运单默认的规则，1表示显示，顺序如下，如111110000表示打印寄方姓名、寄方电话、寄方公司名、寄方地址和重量，收方姓名、收方电话、收方公司名和收方地址按丰密运单默认规则。1：寄方姓名；2：寄方电话；3：寄方公司名；4：寄方地址；5：重量；6：收方姓名；7：收方电话；8：收方公司名；9：收方地址
        30	twoDimensionCode	String(600)	否	二维码	根据规则生成字符串信息,格式为MMM={‘k1’:’（目的地中转场代码）’,’k2’:’（目的地原始网点代码）’,’k3’:’（目的地单元区域）’,’k4’:’（附件通过三维码（express_type_code、 limit_type_code、 cargo_type_code）映射时效类型）’,’k5’:’（运单号）’，’k6’:’（AB标识）’}
        31	proCode	String(30)	否	时效类型	值为二维码中的K4
        32	printIcon	String(100)	否	打印图标	根据托寄物判断需要打印的图标(重货,蟹类,生鲜,易碎，Z标)。返回值有8位，每一位只有0和1两种，0表示按运单默认的规则，1表示显示。后面两位默认0备用。顺序如下：重货,蟹类,生鲜,易碎,医药类,Z标,0,0。如：00000000表示不需要打印重货，蟹类，生鲜，易碎,医药,Z标,备用,备用
        33	abFlag	String(30)	否	AB标	
        34	errMsg	String(1000)	否	查询出现异常时返回信息	返回代码：0-系统异常；1-未找到运单
        35	destPortCode	String（100）	否	目的地口岸代码	
        36	destCountry	String(50)	否	目的国别	国别代码如：JP
        37	destPostCode	String(100	否	目的地邮编	
        38	goodsValueTotal	String(30)	否	总价值	保留两位小数，数字类型，可补位
        39	currencySymbol	String（30）	否	币种	
        40	goodsNumber	String(20)	否	件数	
        2.7. 响应参数<apiResultData>-订单取消
        序号	字段名	类型（约束）	必填	字段说明	描述
        1	msg	String (200)	否	信息	提示信息
        2	succ	String (10)	是	状态码	返回成功或失败信息(ok/fail)
        3	result	String (/)	是	数据	数据
        4	orderid	String (64)	是	客户订单号	
        5	code	Number(1)	是	顺丰运单号	备注。1-客户订单号与顺丰运单不匹配；2-操作成功；
        2.8. 应用场景(JSON)示例-订单确认
        响应报文:

        成功响应:
        {
          "succ": "ok",
          "msg": null,
          "result": {
              "code": "2",
              "proCode": "T6",
              "codingMapping": "W2W",
              "errMsg": null,
              "remark": null,
              "destRouteLabel": "010W+MP",
              "limitTypeCode": "T6",
              "sourceCityCode": "755",
              "destPortCode": null,
              "destCityCode": "010",
              "destTeamCode": null,
              "filter_result": "2",
              "destcode": "010",
              "goodsNumber": null,
              "codingMappingOut": null,
              "printIcon": "00000000",
              "sourceTeamCode": null,
              "proName": "顺丰特惠",
              "destDeptCodeMapping": "010W",
              "twoDimensionCode": "MMM={'k1':'010','k2':'010MP','k3':'','k4':'T6','k5':'SF1310010503902','k6':'','k7':'726f567c'}",
              "abFlag": null,
              "orderid": "14dd61d116f64724b4f3dd3ac96950b7",
              "printFlag": "000000000",
              "currencySymbol": null,
              "origincode": "755",
              "sourceDeptCode": "755",
              "goodsValueTotal": null,
              "cargoTypeCode": "T6",
              "mailno": "SF1310010503902",
              "destCountry": null,
              "destDeptCode": "010",
              "sourceTransferCode": null,
              "destTransferCode": "010",
              "destTeamCodeMapping": null,
              "expressTypeCode": "B1",
              "xbFlag": "0",
              "destPostCode": null
          }
        }
        失败报文-范例1

        {
          "succ": "fail",
          "msg": "子单号重复：SF1344144442021;SF1344144442022;SF1344144442023",
          "result": null
        }
        2.9. 应用场景(JSON)示例-订单取消
        请求报文:

        {
          "orderId":"b361285847084a1b8c60bb1df9288cfe"
        }
        响应报文:

        成功响应:
        {
          "msg": "",
          "succ": "ok",
          "result": {
              "orderid": "2b071273c3a144bdafd411d83004611f",
              "code": "2"
          }
        }
        失败报文-范例1
        {
          "msg":"系统发生数据错误或运行时异常",
          "result": null,
          "succ": "fail"
        }
        失败报文-范例2
        {
          "msg":"已消单导致取消订单失败",
          "result": null,
          "succ": "fail"
        }
        */
        /// <summary>
        /// 订单确认接口-内陆件
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EpsOrderConfirm(string partnerID, string checkword, MsgDataRequestEpsOrderConfirm data, string accessToken = "", string environment = "sfapi")
        {
            /*
            2.3. 请求参数<msgData>-订单确认
            序号	字段名	类型（约束）	必填	默认值	描述
            1	orderId	String(64)	是		客户订单号
            2	mailNo	String(20)	条件		顺丰母运单号(如果dealtype=1，必填)
            3	dealType	String(1)	否	1	客户订单操作标识。1：确认；2：取消；3：丰巢柜寄件取消
            4	customsBatchs	String(20)	否		报关批次
            5	agentNo	String(30)	否		代理单号
            6	consignEmpCode	String(20)	否		收派员工号
            7	sourceZoneCode	String(10)	否		原寄地网点代码
            8	inProcessWaybillNo	String(100)	否		头程运单号
            9	isConfirmNew	String(1)	否		改单类型，默认为0。0：旧订单确认；1：新订单确认类型(支持修改收件方信息，含筛单+产品月结校验)
            10	weight	String(10)	否		订单货物总重量，包含子母件，单位千克，精确到小数点后2位，如果提供此值，必须>0。
            11	volume	String(100)	否		货物的总体积（值为长，宽，高），包含子母件，以半角逗号分隔，单位厘米，精确到小数点后2位，会用于计抛（是否计抛具体商务沟通中双方约定）。
            12	returnTracking	String(30)	否		顺丰签回单服务运单号
            13	expressType	String(5)	否		快件产品类别，详见《附录-2.快件产品类别表》，只有在商务上与顺丰约定的类别方可使用。如果此字段为空，则以下单时的为准。
            14	childrenNos	String(1000)	否		子单号（以半角逗号分隔）。当原订单存在子单号时：不修改子单需传订单所有子单号；修改子单传入需要修改的子单号（需是原订单子单号，且只能取消子单，新增子单请使用子单号申请接口）；清除所有子单传空；当原订单不存在子单号时：此字段无用
            15	waybillSize	String(22)	否		电子运单图片规格 1:A4 2:A5
            16	isGenEletricPic	String(1)	否	1	是否生成电子运单图片
            17	bigHousehold	String(1)	否	否	增值服务:大件入户（IN98）：是/否。
            18	superLongOverweight	String(1)	否	否	增值服务：超长超重（IN23）：是/否。
            19	province	String(30)	否		收件方地址-省份
            20	city	String(100)	否		收件方地址-地级行政区名称
            21	county	String(64)	否		收件方地址-县/区级行政区名称
            22	address	String(64)	否		收件方地址-详细地址（需要修改地址时必填）
            23	company	String(100)	否		收件方-公司名称
            24	contact	String(100)	否		收件方-联系人名称
            25	tel	String(20)	否		收件方-联系电话
            26	mobile	String(20)	否		收件方-手机号
            27	extra1	String(200)	否		自定义字段1
            28	extra2	String(200)	否		自定义字段2
            请求报文:

            {
              "orderId":"14dd61d116f64724b4f3dd3ac96950b7",
              "mailno":"SF1310010503902",
              "dealType":1,
              "isConfirmNew":1,
              "weight":3.56,
              "volume":"33,33,33",
              "bigHousehold":2300,
              "province":"北京市",
              "city":"北京市",
              "county":"顺义区",
              "address":"南法信顺捷大厦9层",
              "expressType":2,
              "childrenNos":"SF1344144442021,SF1344144442022,SF1344144442023"
            }
            2.5. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.6. 响应参数<apiResultData>-订单确认
            序号	字段名	类型（约束）	必填	
            字段说明
            描述
            1	succ	String (10)	是	状态码	返回成功或失败信息(ok/fail)
            2	msg	String (200)	否	信息	提示信息
            3	result	String (/)	是	数据	数据
            4	orderid	String(64)	是	客户订单号	
            5	mailno	String(20)	条件	顺丰母运单号	如果dealtype=1，必填
            6	code	Number(1)	是	响应状态码	1：客户订单号与顺丰运单不匹配；2 ：操作成功
            7	origincode	String(10)	否	原寄地区域代码	可用于顺丰电子运单标签打印。
            8	destcode	String(10)	否	目的地区域代码	可用于顺丰电子运单标签打印。
            9	filter_result	Number(2)	否	筛单结果	2：可收派
            10	remark	String(100)	条件	高峰管控提示信息	【数字】：【高峰管控提示信息】(如 4：温馨提示 ，1：春运延时)
            11	sourceTransferCode	String(60)	否	原寄地中转场	
            12	sourceCityCode	String(60)	否	原寄地城市代码	
            13	sourceDeptCode	String(60)	否	原寄地网点代码	
            14	sourceTeamCode	String(60)	否	原寄地单元区域	
            15	destCityCode	String(60)	否	目的地城市代码	eg:755
            16	destDeptCode	String(60)	否	目的地网点代码	eg:755AQ
            17	destDeptCodeMapping	String(60)	否	目的地网点代码映射码	
            18	destTeamCode	String(60)	否	目的地单元区域	eg:001
            19	destTeamCodeMapping	String(60)	否	目的地单元区域映射码	
            20	destTransferCode	String(60)	否	目的地中转场	
            21	destRouteLabel	String(200)	否	打单时的路由标签信息	如果是大网的路由标签，这里的值是目的地网点代码；如果是同城配的路由标签，这里的值是根据同城配的设置映射出来的值。不同的配置结果会不一样，不能根据-符号切分（如：上海同城配，可能是：集散点-目的地网点-接驳点，也有可能是目的地网点代码-集散点-接驳点）
            22	proName	String(60)	否	产品名称	对应RLS:pro_name
            23	cargoTypeCode	String(30)	否	快件内容	如：C816、SP601
            24	limitTypeCode	String(30)	否	时效代码	如：T4
            25	expressTypeCode	String(30)	否	产品类型	如：B1
            26	codingMapping	String(60)	否	入港映射码	eg:S10
            27	codingMappingOut	String(60)	否	出港映射码	
            28	xbFlag	String(30)	否	XB标志	0:不需要打印XB；1:需要打印XB
            29	printFlag	String(60)	否	打印标志	返回值总共有9位，每一位只有0和1两种，0表示按丰密运单默认的规则，1表示显示，顺序如下，如111110000表示打印寄方姓名、寄方电话、寄方公司名、寄方地址和重量，收方姓名、收方电话、收方公司名和收方地址按丰密运单默认规则。1：寄方姓名；2：寄方电话；3：寄方公司名；4：寄方地址；5：重量；6：收方姓名；7：收方电话；8：收方公司名；9：收方地址
            30	twoDimensionCode	String(600)	否	二维码	根据规则生成字符串信息,格式为MMM={‘k1’:’（目的地中转场代码）’,’k2’:’（目的地原始网点代码）’,’k3’:’（目的地单元区域）’,’k4’:’（附件通过三维码（express_type_code、 limit_type_code、 cargo_type_code）映射时效类型）’,’k5’:’（运单号）’，’k6’:’（AB标识）’}
            31	proCode	String(30)	否	时效类型	值为二维码中的K4
            32	printIcon	String(100)	否	打印图标	根据托寄物判断需要打印的图标(重货,蟹类,生鲜,易碎，Z标)。返回值有8位，每一位只有0和1两种，0表示按运单默认的规则，1表示显示。后面两位默认0备用。顺序如下：重货,蟹类,生鲜,易碎,医药类,Z标,0,0。如：00000000表示不需要打印重货，蟹类，生鲜，易碎,医药,Z标,备用,备用
            33	abFlag	String(30)	否	AB标	
            34	errMsg	String(1000)	否	查询出现异常时返回信息	返回代码：0-系统异常；1-未找到运单
            35	destPortCode	String（100）	否	目的地口岸代码	
            36	destCountry	String(50)	否	目的国别	国别代码如：JP
            37	destPostCode	String(100	否	目的地邮编	
            38	goodsValueTotal	String(30)	否	总价值	保留两位小数，数字类型，可补位
            39	currencySymbol	String（30）	否	币种	
            40	goodsNumber	String(20)	否	件数
            2.8. 应用场景(JSON)示例-订单确认
            响应报文:

            成功响应:
            {
              "succ": "ok",
              "msg": null,
              "result": {
                  "code": "2",
                  "proCode": "T6",
                  "codingMapping": "W2W",
                  "errMsg": null,
                  "remark": null,
                  "destRouteLabel": "010W+MP",
                  "limitTypeCode": "T6",
                  "sourceCityCode": "755",
                  "destPortCode": null,
                  "destCityCode": "010",
                  "destTeamCode": null,
                  "filter_result": "2",
                  "destcode": "010",
                  "goodsNumber": null,
                  "codingMappingOut": null,
                  "printIcon": "00000000",
                  "sourceTeamCode": null,
                  "proName": "顺丰特惠",
                  "destDeptCodeMapping": "010W",
                  "twoDimensionCode": "MMM={'k1':'010','k2':'010MP','k3':'','k4':'T6','k5':'SF1310010503902','k6':'','k7':'726f567c'}",
                  "abFlag": null,
                  "orderid": "14dd61d116f64724b4f3dd3ac96950b7",
                  "printFlag": "000000000",
                  "currencySymbol": null,
                  "origincode": "755",
                  "sourceDeptCode": "755",
                  "goodsValueTotal": null,
                  "cargoTypeCode": "T6",
                  "mailno": "SF1310010503902",
                  "destCountry": null,
                  "destDeptCode": "010",
                  "sourceTransferCode": null,
                  "destTransferCode": "010",
                  "destTeamCodeMapping": null,
                  "expressTypeCode": "B1",
                  "xbFlag": "0",
                  "destPostCode": null
              }
            }
            失败报文-范例1

            {
              "succ": "fail",
              "msg": "子单号重复：SF1344144442021;SF1344144442022;SF1344144442023",
              "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EPS_ORDER_UPDTE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseEpsOrderConfirm>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.succ == "ok")
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 订单取消接口-内陆件
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EpsOrderCancel(string partnerID, string checkword, MsgDataRequestEpsOrderCancel data, string accessToken = "", string environment = "sfapi")
        {
            /*
            2.4. 请求参数<msgData>-订单取消
            序号	字段名	类型（约束）	必填	默认值	描述
            1	orderId	String(64)	是		客户订单号
            请求报文:

            {
              "orderId":"b361285847084a1b8c60bb1df9288cfe"
            }
            2.7. 响应参数<apiResultData>-订单取消
            序号	字段名	类型（约束）	必填	字段说明	描述
            1	msg	String (200)	否	信息	提示信息
            2	succ	String (10)	是	状态码	返回成功或失败信息(ok/fail)
            3	result	String (/)	是	数据	数据
            4	orderid	String (64)	是	客户订单号	
            5	code	Number(1)	是	顺丰运单号	备注。1-客户订单号与顺丰运单不匹配；2-操作成功；
            响应报文:

            成功响应:
            {
              "msg": "",
              "succ": "ok",
              "result": {
                  "orderid": "2b071273c3a144bdafd411d83004611f",
                  "code": "2"
              }
            }
            失败报文-范例1
            {
              "msg":"系统发生数据错误或运行时异常",
              "result": null,
              "succ": "fail"
            }
            失败报文-范例2
            {
              "msg":"已消单导致取消订单失败",
              "result": null,
              "succ": "fail"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EPS_ORDER_UPDTE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseEpsOrderCancel>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.succ == "ok")
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 订单确认/取消接口-内陆件

        /// <summary>
        /// 订单结果查询接口-内陆件
        /// 企业创建订单后，通过此接口查询到订单状态及订单详情等相关信息查询
        /// 该接口用于：因Internet环境下，网络不是绝对可靠，用户系统下订单到顺丰快递管家后，不一定可以收到顺丰快递管家返回的数据，此接口用于在未收到返回数据时，查询下订单接口客户订单当前的处理情况。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EpsSearchOrderResp(string partnerID, string checkword, MsgDataRequestEpsSearchOrderResp data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            该接口用于：因Internet环境下，网络不是绝对可靠，用户系统下订单到顺丰快递管家后，不一定可以收到顺丰快递管家返回的数据，此接口用于在未收到返回数据时，查询下订单接口客户订单当前的处理情况。

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_EPS_SEARCH_ORDER_RESP
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_EPS_SEARCH_ORDER_RESP）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String(100)	条件	accessToken,使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	字段名	            类型(约束)            必填	            默认值            描述
            1	orderId	String(64)	是		客户订单号
            2	searchType	String(1)	否		查询类型：1,正向单查询，传入的orderid为正向定单号，2，退货单查询，传入的orderid为退货原始订单号
            请求报文:

            {
              "orderId":"13fee33778934ed0a7c0165c794ab73f",
              "searchType":1
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	字段名	类型（约束）	必填	
            字段说明
            描述
            1	succ	String (10)	是	状态码	返回成功或失败信息(ok/fail)
            2	msg	String (200)	否	信息	提示信息
            3	result	String (/)	是	数据	数据
            4	orderid	String(64)	是	客户订单号	
            5	mailno	String(20)	是	顺丰母运单号	
            6	origincode	String(10)	否	原寄地区域代码	可用于顺丰电子运单标签打印。
            7	destcode	String(10)	否	目的地区域代码	可用于顺丰电子运单标签打印。
            8	filter_result	String(2)	否	筛单结果	2：可收派
            9	remark	String(100)	条件	高峰管控提示信息	【数字】：【高峰管控提示信息】(如 4：温馨提示 ，1：春运延时)
            10	sourceTransferCode	String(60)	否	原寄地中转场	
            11	sourceCityCode	String(60)	否	原寄地城市代码	
            12	sourceDeptCode	String(60)	否	原寄地网点代码	
            13	sourceTeamCode	String(60)	否	原寄地单元区域	
            14	destCityCode	String(60)	否	目的地城市代码	eg:755
            15	destDeptCode	String(60)	否	目的地网点代码	eg:755AQ
            16	destDeptCodeMapping	String(60)	否	目的地网点代码映射码	
            17	destTeamCode	String(60)	否	目的地单元区域	eg:001
            18	destTeamCodeMapping	String(60)	否	目的地单元区域映射码	
            19	destTransferCode	String(60)	否	目的地中转场	
            20	destRouteLabel	String(200)	否	打单时的路由标签信息	如果是大网的路由标签，这里的值是目的地网点代码；如果是同城配的路由标签，这里的值是根据同城配的设置映射出来的值。不同的配置结果会不一样，不能根据-符号切分（如：上海同城配，可能是：集散点-目的地网点-接驳点，也有可能是目的地网点代码-集散点-接驳点）
            21	proName	String(60)	否	产品名称	对应RLS:pro_name
            22	cargoTypeCode	String(30)	否	快件内容	如：C816、SP601
            23	limitTypeCode	String(30)	否	时效代码	如：T4
            24	expressTypeCode	String(30)	否	产品类型	如：B1
            25	codingMapping	String(60)	否	入港映射码	eg:S10
            26	codingMappingOut	String(60)	否	出港映射码	
            27	xbFlag	String(30)	否	XB标志	0:不需要打印XB；1:需要打印XB
            28	printFlag	String(60)	否	打印标志	返回值总共有9位，每一位只有0和1两种，0表示按丰密运单默认的规则，1表示显示，顺序如下，如111110000表示打印寄方姓名、寄方电话、寄方公司名、寄方地址和重量，收方姓名、收方电话、收方公司名和收方地址按丰密运单默认规则。1：寄方姓名；2：寄方电话；3：寄方公司名；4：寄方地址；5：重量；6：收方姓名；7：收方电话；8：收方公司名；9：收方地址
            29	twoDimensionCode	String(600)	否	二维码	根据规则生成字符串信息,格式为MMM={‘k1’:’（目的地中转场代码）’,’k2’:’（目的地原始网点代码）’,’k3’:’（目的地单元区域）’,’k4’:’（附件通过三维码（express_type_code、 limit_type_code、 cargo_type_code）映射时效类型）’,’k5’:’（运单号）’，’k6’:’（AB标识）’}
            30	proCode	String(30)	否	时效类型	值为二维码中的K4
            31	printIcon	String(100)	否	打印图标	根据托寄物判断需要打印的图标(重货,蟹类,生鲜,易碎，Z标)。返回值有8位，每一位只有0和1两种，0表示按运单默认的规则，1表示显示。后面两位默认0备用。顺序如下：重货,蟹类,生鲜,易碎,医药类,Z标,0,0。如：00000000表示不需要打印重货，蟹类，生鲜，易碎,医药,Z标,备用,备用
            32	abFlag	String(30)	否	AB标	
            33	errMsg	String(1000)	否	查询出现异常时返回信息	返回代码：0-系统异常；1-未找到运单
            34	destPortCode	String（100）	否	目的地口岸代码	
            35	destCountry	String(50)	否	目的国别	国别代码如：JP
            36	destPostCode	String(100	否	目的地邮编	
            37	goodsValueTotal	String(30)	否	总价值	保留两位小数，数字类型，可补位
            38	currencySymbol	String（30）	否	币种	
            39	goodsNumber	String(20)	否	件数	
            2.6. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "succ": "ok",
              "msg": null,
              "result": {
                  "proCode": "T4",
                  "codingMapping": null,
                  "errMsg": null,
                  "remark": null,
                  "destRouteLabel": "010",
                  "limitTypeCode": "T4",
                  "sourceCityCode": null,
                  "destPortCode": null,
                  "destCityCode": "010",
                  "destTeamCode": null,
                  "filter_result": "2",
                  "destcode": "010",
                  "goodsNumber": null,
                  "codingMappingOut": null,
                  "printIcon": null,
                  "sourceTeamCode": null,
                  "proName": null,
                  "destDeptCodeMapping": null,
                  "twoDimensionCode": "MMM={'k1':'010','k2':'010','k3':'','k4':'T4','k5':'SF1344284442276','k6':'','k7':''}",
                  "abFlag": null,
                  "orderid": "13fee33778934ed0a7c0165c794ab73f",
                  "printFlag": null,
                  "currencySymbol": null,
                  "origincode": null,
                  "sourceDeptCode": null,
                  "goodsValueTotal": null,
                  "cargoTypeCode": "C201",
                  "mailno": "SF1344284442276",
                  "destCountry": null,
                  "destDeptCode": "010",
                  "sourceTransferCode": null,
                  "destTransferCode": null,
                  "destTeamCodeMapping": null,
                  "expressTypeCode": "B1",
                  "xbFlag": null,
                  "destPostCode": null
              }
            }
            失败报文-范例1

            {
              "succ": "fail",
              "msg": "订单结果查询订单异常，未返回数据",
              "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EPS_SEARCH_ORDER_RESP";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseEpsSearchOrderResp>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.succ == "ok")
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 运费查询接口-内陆件
        /// 顺丰快递管家内陆件运单，交接至顺丰后，通过此接口查询产生的标准运费信息
        /// 该接口用于：客户在通过顺丰快递管家下订单接口提交订单后，可使用此接口根据订单号查询清单运费。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EpsQuerySFWaybill(string partnerID, string checkword, MsgDataRequestEpsQuerySFWaybill data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            该接口用于：客户在通过顺丰快递管家下订单接口提交订单后，可使用此接口根据订单号查询清单运费。

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_EPS_QUERY_SFWAYBILL
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_EPS_QUERY_SFWAYBILL）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String(100)	条件	accessToken,使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	字段名	类型（约束）	必填	默认值	描述
            1	orderId	String(64)	是		客户订单号
            请求报文:

            {
              "orderId":"79fe3d8e4e9540ee9d813e8dcbe94efe"
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	字段名	类型（约束）	必填	字段说明	描述
            1	msg	String(200)	否	信息	提示信息
            2	succ	String(10)	是	状态码	返回成功或失败信息(ok/fail)
            3	result	String(/)	是	数据	数据
            4	orderId	String(64)	否	返回客户订单号	
            5	waybillNo	String(30)	是	返回运单号	
            6	waybillChilds	String	否	返回子单号	多个英文逗号分隔
            7	customerAcctCode	String(64)	否	返回月结帐号	
            8	meterageWeightQty	Number(17,3)	是	返回计费重量	
            9	limitTypeCode	String(30)	是	返回时效类型	
            10	productName	String(30)	否	产品名称	
            11	expressTypeCode	String(30)	否	产品类型	
            12	consValue	String(30)	否	声明价值	
            13	consValueCurrencyCode	String(30)	否	声明价值币种	
            14	jProvince	String(20)	否	寄件省份	
            15	jCity	String(20)	否	寄件城市	
            16	dProvince	String(20)	否	收件省份	
            17	dCity	String(20)	否	收件城市	
            18	consignorAddr	String(200)	否	寄件详细地址	
            19	consignorPhone	String(20)	否	寄件电话	
            20	consignorMobile	String(20)	否	寄件手机	
            21	consignorContName	String(20)	否	寄件联系人	
            22	addresseeAddr	String(200)	否	收件详细地址	
            23	addresseePhone	String(20)	否	收件电话	
            24	addresseeMobile	String(20)	否	收件手机	
            25	addresseeContName	String(20)	否	收件联系人	
            26	feeList	List<FeeInfo>	否	费用集合	
            2.6. 响应参数<feeList>
            序号	字段名	类型（约束）	必填	字段说明	描述
            1	type	String(2)	是	费用类型	
            2	name	String(100)	是	费用名称	
            3	value	Number(17,3)	是	费用金额	
            4	paymentTypeCode	String(1)	否	付款类型	1-寄付；2-到付；3-第三方付；
            5	settlementTypeCode	String(1)	否	结算类型	1-现结；2-月结；
            2.7. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "succ":"ok",
              "msg":null,
              "result": {
                  "meterageWeightQty":"1.0",
                  "orderId":"79fe3d8e4e9540ee9d813e8dcbe94efe",
                  "limitTypeCode":"T4",
                  "addresseeAddr":"广东省深圳市南山区广东省深圳市南山区深南大道9037号",
                  "consValueCurrencyCode":null,
                  "productName":null,
                  "addresseeContName":"小顺",
                  "consignorProvince":"北京市",
                  "consignorMobile":"95338",
                  "addresseeProvince":"北京市",
                  "addresseePhone":"4008111111",
                  "customerAcctCode":"7551234567",
                  "consValue":null,
                  "addresseeCity":"北京市",
                  "consignorAddr":"广东省深圳市南山区粤海街道海阔天空雅居B栋16B",
                  "consignorPhone":"95338",
                  "consignorCity":"北京市",
                  "waybillChilds":null,
                  "addresseeMobile":"4008111111",
                  "expressTypeCode":"B1",
                  "consignorContName":"小丰",
                  "waybillNo":"SF1011853960319",
                  "feeList": [
                      {
                          "type": "1",
                          "name": "运费",
                          "value": "23.0",
                          "paymentTypeCode": null,
                          "settlementTypeCode": null
                      },
                      {
                          "type": "14",
                          "name": "燃油附加费",
                          "value": "15.0",
                          "paymentTypeCode": null,
                          "settlementTypeCode": null
                      }
                  ]
              }
            }
            失败报文-范例1
            {
              "succ": "fail",
              "msg":"没有运单信息",
              "result": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EPS_QUERY_SFWAYBILL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseEpsQuerySFWaybill>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.succ == "ok")
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 路由推送接口-内陆件 COM_PUSH_EPS_ROUTES
        /// 通过顺快递管家内陆件下单后，使用此接口客户推送对应运单路由
        /// 该接口用于：当路由信息产生后向客户主动推送要求的顺丰运单路由信息。
        /// 客户需提供一个符合以下规范的HTTP/HTTPS URL，以接收顺丰快递管家通用接口推送的信息：
        /// 1.路由信息为JSON格式，通过HTTP/HTTPS POST方式推送给客户；
        /// 2.在客户处理完路由信息后，向顺丰快递管家通用接口返回响应JSON信息，响应JSON报文结果只能为OK/ERR，如为ERR，顺丰快递管家通用接口将重新推送该路由信息，失败3次后不再推送；
        /// 注：1.此接口建议客户方系统做验签功能，规避被恶意攻击的风险；
        /// 2.建议使用订单号作为筛选条件进行订单信息的更新，因为运单号存在可能为子单号/签回单号的情况；
        /// 3.测试环境如需测试该接口，请将测试环境下单后的订单号与运单号发给顺丰研发接口人，便于其生成相关测试数据；
        /// 4.推送方式为增量推送，对于同一个顺丰运单的同一条信息，推送成功则不重复推送，推送失败则会再次推送，失败3次后不再推送；
        /// 5.以防推送接口有延迟，建议配合对应查询接口，对一段时间内没有收到推送消息的订单，主动查询路由信息；
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static ResponsePushEpsRoutes PushEpsRoutes(string body, out RequestPushEpsRoutes msgData)
        {
            /*
            1. 功能描述
            该接口用于：当路由信息产生后向客户主动推送要求的顺丰运单路由信息。

            客户需提供一个符合以下规范的HTTP/HTTPS URL，以接收顺丰快递管家通用接口推送的信息：
            1.路由信息为JSON格式，通过HTTP/HTTPS POST方式推送给客户；
            2.在客户处理完路由信息后，向顺丰快递管家通用接口返回响应JSON信息，响应JSON报文结果只能为OK/ERR，如为ERR，顺丰快递管家通用接口将重新推送该路由信息，失败3次后不再推送；

            注：1.此接口建议客户方系统做验签功能，规避被恶意攻击的风险；
                2.建议使用订单号作为筛选条件进行订单信息的更新，因为运单号存在可能为子单号/签回单号的情况；
                3.测试环境如需测试该接口，请将测试环境下单后的订单号与运单号发给顺丰研发接口人，便于其生成相关测试数据；
                4.推送方式为增量推送，对于同一个顺丰运单的同一条信息，推送成功则不重复推送，推送失败则会再次推送，失败3次后不再推送；
                5.以防推送接口有延迟，建议配合对应查询接口，对一段时间内没有收到推送消息的订单，主动查询路由信息；
            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_PUSH_EPS_ROUTES
            批量交易	不支持
            接口类型	推送
            报文类型	JSON
            2.2. 请求参数
            序号	字段名	类型（约束）	必填	描述
            1	id	String(15)	是	路由节点信息编号，每一个id代表一条不同的路由节点信息。
            2	mailno	String(20)	是	顺丰运单号
            3	orderid	String(64)	是	客户订单号
            4	acceptTime	String(20)	是	路由节点产生的时间，格式：YYYY-MM-DD HH24:MM:SS，示例：2012-7-30 09:30:00。
            5	acceptAddress	String(100)	是	路由节点发生的城市
            6	remark	String(300)	是	路由节点具体描述
            7	opCode	String(20)	是	路由节点操作码
            2.3. 响应参数
            序号	字段名	类型（约束）	必填	字段说明	描述
            1	status	String(10)	是	接收推送信息状态	OK-成功，ERR-失败；失败会重推两次，共推送三次，全部返回ERR则不再推送。
            2.4. 应用场景(JSON)示例
            请求报文:

            {
              "id":"10049361064087",
              "mailno":"619428034014",
              "orderid":"TEST20200506181000",
              "acceptTime":"2020-05-05 18:30:00",
              "acceptAddress":"深圳",
              "remark":"上门收件",
              "opCode":"50"
            }
            响应报文:

            成功响应:
            {
            "status":"OK"
            }
            失败报文-范例1
            {
            "status":"ERR"
            }
            */
            string status = "ERR";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushEpsRoutes>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    status = "OK";
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushEpsRoutes() { 
                status = status
            };
        }

        /// <summary>
        /// 运费估算接口（含增值服务）-内陆件
        /// 订单创建前，可通过此接口预估订单可能产生的标准运费
        /// 该接口用于：在下单生成实际运费之前，根据运费计算公式及逻辑，产生的预估费用（包含增值服务）。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EpsEstimatesWaybillFee(string partnerID, string checkword, MsgDataRequestEpsEstimatesWaybillFee data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            该接口用于：在下单生成实际运费之前，根据运费计算公式及逻辑，产生的预估费用（包含增值服务）。
            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_EPS_ESTIMATES_WAYBILL_FEE
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_EPS_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	expiresIn	Number	条件	accessToken,使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	字段名	类型（约束）	必填	默认值	描述
            1	companyId	String(20)	是		分配客户sendAppId
            2	senderProvince	String(30)	是		寄件方所在省份。字段填写要求：必须是标准的省名称称谓 如：广东省，如果是直辖市，请直接传北京、上海等。
            3	senderCity	String(100)	是		寄件方所在城市名称。必须是标准的城市称谓 如：深圳市。
            4	senderArea	String(100)	否		寄件区/县。必须是标准的区/县称谓 如：南山区。
            5	senderAddress	String(450)	是		寄件详细地址。此详细地址需包含省市信息，以提高地址识别的成功率，示例：“广东省深圳市福田区新洲十一街万基商务大厦10楼”。
            6	receiptProvince	String(30)	是		到件方所在省份。字段填写要求：必须是标准的省名称称谓 如：广东省，如果是直辖市，请直接传北京、上海等。
            7	receiptCity	String(100)	是		到件方所在城市名称。必须是标准的城市称谓 如：深圳市。
            8	receiptArea	String(100)	否		到件区/县。必须是标准的区/县称谓 如：南山区。
            9	receiptAddress	String(450)	是		到件方详细地址。此详细地址需包含省市信息，以提高地址识别的成功率，示例：“广东省深圳市福田区新洲十一街万基商务大厦10楼”。
            10	payMethod	String(1)	是		运费付款方式，根据实际情况选择一种付款方式：0-寄付月结；1-寄付现结；2-收方付；3-第三方付；
            11	monthlyCard	String(10)	条件		月结卡号。如果是月结账户，必填字段；付款方式为月结时，必填字段；修改代收货款，必填字段；
            12	expressType	String(4)	是		业务类型产品编码。如1，2，154等，详见《附录-2.快件产品类列表》。
            13	depositumInfo	String(128)	是		托寄物内容，按实际托寄物填写，可填写简称（文件、水果等）
            14	packagesNo	String(5)	否	1	件数
            15	parcelWeighs	Number(16,3)	否		包裹重量，订单货物单位重量，包含子母件，单位千克，精确到小数点后3位并大于0.001，跨境件报关需要填写
            16	isCodServiceValue	Number(1)	否		是否代收：0-否；1-是；
            17	codServiceValue	Number(16,3)	否	未开通额度：500020000000；开通额度：5.000100000.000	代收金额，当isCollection=1时根据实际代收金额填写，isCollection=0时则无需填写
            18	isAddServiceValue	Number(1)	否		是否保价：0-否；1-是；
            19	addServiceValue	Number(16,3)	否	范围：1000~500000000	保价金额，如需保价时，填写物品声明价值以原寄地所在区域币种为准，如中国大陆为人民币，香港为港币，保留3位小数。没有保价金额则无需填写，限制在1到50万之间
            20	isReceipt	Number(1)	否		是否签回单：0-否；1-是；
            21	fresh	Number(1)	否		保鲜服务：0-否；1-是；
            22	packaging	Number(1)	否		包装服务：0-否；1-是；
            请求报文:

            {
                "companyId": xxx,
                "senderProvince": "广东省",
                "senderCity": "深圳市",
                "senderArea": "南山区",
                "senderAddress": "广东省深圳市南山区粤海街道海阔天空雅居B栋16B",
                "receiptProvince": "北京市",
                "receiptCity": "北京市",
                "receiptArea": "顺义区",
                "receiptAddress": "北京市顺义区南法信顺捷大厦",
                "payMethod": "2",
                "monthlyCard": "9999999999",
                "expressType": "1",
                "depositumInfo": "电脑",
                "packagesNo": 3,
                "parcelWeighs": 10.00,
                "isCodServiceValue": 1,
                "codServiceValue": 100,
                "isAddServiceValue": 1,
                "addServiceValue": 1000,
                "isReceipt": 1,
                "fresh": 1,
                "packaging": 1
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	字段名	类型（约束）	必填	字段说明	描述
            1	msg	String (200)	否	信息	提示信息
            2	succ	String (10)	是	状态码	返回成功或失败信息(ok/fail)
            3	result	String (/)	是	数据	数据，可能为空
            5	originalPrice	String(10)	是		基础运费原价
            5	discountPrice	String(10)	否		基础运费折后价
            5	subPrice	String(10)	否		基础运费折扣差价
            5	vas	List<Map>	否		增值服务列表
            5	totalBD	BigDecimal(10,1)	否		总价，计算用
            5	total	String(10)	否		总价
            2.6. 响应参数<vas>
            序号	字段名	类型（约束）	必填	字段说明	描述
            1	vasName	String (10)	否		增值服务名称
            2	vasValue	String (10)	否		增值服务费用，值为空时以- -表示
            2.6. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "result": {
                    "originalPrice": "150.0",
                    "discountPrice": "",
                    "subPrice": "",
                    "vas": [
                        {
                            "vasName": "代收货款",
                            "vasValue": "--"
                        },
                        {
                            "vasName": "包装服务",
                            "vasValue": "--"
                        },
                        {
                            "vasName": "保价",
                            "vasValue": "10.0"
                        },
                        {
                            "vasName": "签单返还(纸质回单)",
                            "vasValue": "8.0"
                        }
                    ],
                    "totalBD": 168.0,
                    "total": "168.0"
                },
                "succ": "ok",
                "msg": null
            }
            失败报文-范例1
            {
		            "result": null,
		            "succ": "fail",
		            "msg": "运费估算接口（含增值服务） 未开通或已禁用"
            }
            失败报文-范例2
            {
		            "msg":"运费估算（含增值服务）查询失败，请联系管理员",
		            "result": null,
		            "succ": "fail"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EPS_ESTIMATES_WAYBILL_FEE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseEpsEstimatesWaybillFee>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.succ == "ok")
                        {
                            errcode = "0";
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 清单运费推送接口-内陆件 COM_PUSH_EPS_WAYBILLS_FEE
        /// 顺丰快递管家内陆件运单，交接至顺丰后，通过此接口推送客户产生的标准运费信息
        /// 暂无内容，敬请期待
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData"></param>
        /// <returns></returns>
        public static ResponsePushEpsWaybillsFee PushEpsWaybillsFee(string body, out RequestPushEpsWaybillsFee msgData)
        {
            /*
            暂无内容，敬请期待
            */
            string status = "ERR";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushEpsWaybillsFee>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    status = "OK";
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushEpsWaybillsFee()
            {
                //status = status
            };
        }

        /// <summary>
        /// 订单状态推送接口-内陆件 COM_PUSH_EPS_ORDER_STATES
        /// 企业创建订单后，通过此接口推送客户订单状态及订单详情等相关信息查询
        /// 该接口用于：根据用户传的信息默认返回就近的十个网点信息。
        /// 客户需提供一个符合以下规范的HTTP/HTTPS URL，以接收顺丰快递管家通用接口推送的信息：
        /// 1.路由信息为JSON格式，通过HTTP/HTTPS POST方式推送给客户；
        /// 2.在客户处理完订单状态信息后，向顺丰快递管家通用接口返回响应JSON信息，响应JSON报文结果只能为OK/ERR，如为ERR，顺丰快递管家通用接口将重新推送该订单状态信息，失败3次后不再推送；
        /// 注：1.此接口建议客户方系统做验签功能，规避被恶意攻击的风险；
        /// 2.建议使用订单号作为筛选条件进行订单信息的更新，因为运单号存在可能为子单号/签回单号的情况；
        /// 3.测试环境如需测试该接口，请将测试环境下单后的订单号与运单号发给顺丰研发接口人，便于其生成相关测试数据；
        /// 4.推送方式为增量推送，对于同一个顺丰运单的同一条信息，推送成功则不重复推送，推送失败则会再次推送，失败3次后不再推送；
        /// 5.以防推送接口有延迟，建议配合对应查询接口，对一段时间内s没有收到推送消息的订单，主动查询订单状态信息；
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData"></param>
        /// <returns></returns>
        public static ResponsePushEpsOrderStates PushEpsOrderStates(string body, out RequestPushEpsOrderStates msgData)
        {
            /*
            1. 功能描述
            该接口用于：根据用户传的信息默认返回就近的十个网点信息。
            客户需提供一个符合以下规范的HTTP/HTTPS URL，以接收顺丰快递管家通用接口推送的信息：
            1.路由信息为JSON格式，通过HTTP/HTTPS POST方式推送给客户；
            2.在客户处理完订单状态信息后，向顺丰快递管家通用接口返回响应JSON信息，响应JSON报文结果只能为OK/ERR，如为ERR，顺丰快递管家通用接口将重新推送该订单状态信息，失败3次后不再推送；
            注：1.此接口建议客户方系统做验签功能，规避被恶意攻击的风险；
                2.建议使用订单号作为筛选条件进行订单信息的更新，因为运单号存在可能为子单号/签回单号的情况；
	            3.测试环境如需测试该接口，请将测试环境下单后的订单号与运单号发给顺丰研发接口人，便于其生成相关测试数据；
	            4.推送方式为增量推送，对于同一个顺丰运单的同一条信息，推送成功则不重复推送，推送失败则会再次推送，失败3次后不再推送；
	            5.以防推送接口有延迟，建议配合对应查询接口，对一段时间内没有收到推送消息的订单，主动查询订单状态信息；
            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_PUSH_EPS_ORDER_STATES
            批量交易	不支持
            接口类型	推送
            报文类型	JSON
            2.2. 请求参数
            序号	字段名	类型（约束）	必填	描述
            1	orderNo	String(64)	是	客户订单号
            2	waybillNo	String(64)	否	顺丰运单号
            3	orderStateCode	String(20)	是	订单状态
            4	orderStateDesc	String(200)	是	订单状态描述
            5	empCode	String(100)	否	收件员工工号
            6	empPhone	String(100)	否	收件员手机号
            7	netCode	String(20)	否	网点
            8	lastTime	date	否	最晚上门时间
            9	bookTime	date	否	客户预约时间
            10	carrierCode	String(10)	是	承运商代码(SF)
            请求报文:

            {
	            "orderNo": "52840aa5ec1c4f52a20864baad9c70c5",
                "waybillNo": "SF1011853605618",
                "orderStateCode": "04-40001",
                "orderStateDesc": "调度成功+收派员信息",
                "empCode": "01381324",
                "empPhone": "13888888888",
                "netCode": "755A",
                "lastTime": "2021-01-02 01:01:01",
                "bookTime": "2020-03-02 01:01:01",
                "carrierCode": "SF"
            }
            2.3. 响应参数
            序号	字段名	类型（约束）	必填	字段说明	描述
            1	status	String(10)	是	接收推送信息状态	OK-成功，ERR-失败；失败会重推两次，共推送三次，全部返回ERR则不再推送。
            2.4. 应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "status":"OK"
            }
            失败报文
            {
                "status":"ERR"
            }
            */
            string status = "ERR";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushEpsOrderStates>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    status = "OK";
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushEpsOrderStates()
            {
                status = status
            };
        }

        #endregion 快递管家服务类接口

        #region 函证通服务类接口

        /// <summary>
        /// 函证寄件下单接口
        /// 创建函证通订单
        /// 向函证通下单并且向顺丰大网下运单，立即生成顺丰运单号并返回， 可以批量下单接口，如果采用批量下单模式，单次不要超过10单；
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static void HztsaBatchCreateWaybills(string partnerID, string checkword, MsgDataRequestHztsaBatchCreateWaybills data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            向函证通下单并且向顺丰大网下运单，立即生成顺丰运单号并返回， 可以批量下单接口，如果采用批量下单模式，单次不要超过10单；

            2. 接口定义
            2.1. 接口基本信息

            名称	值
            接口服务代码	COM_RECE_HZTSA_BATCH_CREATE_WAYBILLS
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<http请求头公共参数>

            序号	字段名	类型	必填	描述
            1	appCode	String(36)	是	客户接入标识，由顺丰统一分配
            2	timestamp	String(36)	是	时间戳字符串，时间格式yyyyMMddHHmmssSSS，如20190918185544911
            3	requestId	String(18)	是	接口流水号，18位随机字符串
            2.3. 元素<请求>

            序号	字段名	类型	必填	描述
            1	customerOrderNo	String(36)	是	订单号
            2	sendName	String(36)	是	寄件人姓名
            3	sendTel	String(20)	条件	寄件人联系电话（寄件人固定电话和寄件人联系电话二选一填写）
            4	sendMobile	String(20)	条件	寄件人固定电话（寄件人固定电话和寄件人联系电话二选一填写）
            5	sendAddress	String(200)	是	寄件人详细地址
            6	sendProvince	String(30)	否	寄件人省份
            7	sendCity	String(60)	否	寄件人城市
            8	sendCounty	String(60)	否	寄件人区/县
            9	sendCompany	String(120)	否	寄件公司
            10	receiveName	String(45)	是	收件人姓名
            11	receiveTel	String(20)	条件	收件人联系电话（收件人联系电话和收件人固定电话二选一填写）
            12	receiveMobile	String(20)	条件	收件人固定电话（收件人联系电话和收件人固定电话二选一填写）
            13	receiveAddress	String(200)	是	收件人详细地址
            14	receiveProvince	String(30)	否	收件人省份
            15	receiveCity	String(60)	否	收件人城市
            16	receiveCounty	String(60)	否	收件人区/县
            17	receiveCompany	String(120)	否	收件公司
            18	batchNo	String(30)	否	发函批次号(不填由系统自动生成)
            19	payType	Number(1)	是	付款方式:1:寄付现结 2:寄付月结 3:到付 4:第三方付
            20	monthlyCust	String(36)	条件	月结卡号，寄付月结和第三方付时必填
            21	expressType	String(4)	是	快件产品类别，传值产品编码，详见《附录-2.快件产品类别表》，只有在商务上与顺丰约定的类别方可使用
            22	bspType	Number(1)	是	子母件类型 1：一票一件 2：子母件
            23	isDoCall	Number(1)	否	是否要求通过手持终端通知顺丰收派员收件，1-要求，0-不要求
            24	sendStartTime	String(20)	否	预约上门取件开始时间，格式：YYYY-MM-DD HH24:MM:SS 示例：2012-7-30 09:30:00
            25	productName	String(100)	是	托寄物名称
            26	packageNumber	Number(5)	是	托寄物件数，一个包裹对应一个运单号；若包裹数大于1，则返回一个母运单号和N-1个子运单号
            27	productWeight	Number(10,3)	否	订单货物总重量，包含子母件，单位千克,精确到小数点后3位，如果提供此值,必须>0 。
            28	productCodes	String[]	否	托寄物编号集合
            29	bizOrderAddService	BizOrderAddService	否	增值服务
            30	remark	String(200)	否	备注
            31	needQrCode	Number(1)	否	是否需要生成二维码 ，0：否 1：是 ，默认为0，不需要
            32	orgCode	String(30)	否	组织编码
            2.4. 元素<请求>BizOrderAddService

            序号	字段名	类型	必填	描述
            1	codValue	Number(9)	否	代收货款金额（单位：分）
            2	codMonthlyCust	String(36)	条件	代收货款月结卡号(代收货款金额大于0时必填)
            3	insureValue	Number(8)	否	保价金额 (单位：分)
            4	needReturnTrack	Number(1)	否	是否需要签回单 (1-是 0-否)
            5	returnTrackRequire	String(200)	否	回单要求
            6	electronReceipt	String(4)	否	电子签收类型，取值见附录-[电子签收类型]
            7	isSignAffirm	Number(1)	否	是否密钥认证 0-否 1-是
            8	individuationPackageValue	Number(9)	否	个性化包装费用( 单位 分)
            9	psign	String(4)	否	拍照签收类型，1- 身份证，2- 军官证，3- 护照，4- 其他
            10	customizedService	String(30)	否	客制化服务产品编码
            11	customizedServiceParam	String(30)	否	客制化服务参数

            请求报文：

            [{
                "customerOrderNo": "O20211108143420888",
                "receiveName": "丰一样的男人",
                "receiveTel": "95338",
                "receiveAddress": "武侯区创业路111号",
                "receiveProvince": "四川省",
                "receiveCity": "成都市",
                "receiveCounty": "武侯区",
                "receiveCompany": "四川顺丰速运",
                "sendName": "顺丰",
                "sendTel": "95338",
                "sendAddress": "武侯区创业路1号",
                "sendProvince": "四川省",
                "sendCity": "成都市",
                "sendCounty": "武侯区",
                "sendCompany": "四川顺丰速运",
                "batchNo": "2019112801",
                "payType": 1,
                "monthlyCust": "9999999999",
                "expressType": "1",
                "bspType": 1,
                "isDoCall": 1,
                "productName": "文件",
                "packageNumber": 1,
                "productWeight": "1.5",
                "productCodes": [2021111001,202111100111,202111100123],
                "remark": "我是备注"
            }]
            2.5. 元素<响应>

            序号	字段名	类型	必填	描述
            1	code	String(30)	是	响应编码
            2	success	boolean	否	响应结果：true 成功； false 失败
            3	msg	String(200)	是	结果描述
            4	data	String	否	业务处理结果
            2.6. 应用场景(JSON)示例
            响应报文:

            ​ 成功响应:

            {
                "code": 200,
                "success": true,
                "msg": null,
                "data": [
                    {
                        "customerOrderNo": "O20211108143420888",
                        "success": true,
                        "msg": null,
                        "printParams": {
                            "mainMailNo": "SF1324403762888",
                            "sendCompany": "四川顺丰速运",
                            "sendName": "顺丰",
                            "sendTel": "95338",
                            "sendMobile": null,
                            "sendProvince": "四川省",
                            "sendCity": "成都市",
                            "sendCounty": "武侯区",
                            "sendAddress": "武侯区创业路1号",
                            "receiveCompany": "四川顺丰速运",
                            "receiveName": "丰一样的男人",
                            "receiveTel": "95338",
                            "receiveMobile": null,
                            "receiveProvince": "四川省",
                            "receiveCity": "成都市",
                            "receiveCounty": "武侯区",
                            "receiveAddress": "武侯区创业路111号",
                            "productName": "文件",
                            "productCode": "2021111001,202111100111,202111100123",
                            "packageNumber": 1,
                            "productWeight": 1.5,
                            "returnTrackNo": "",
                            "payType": 1,
                            "payTypeName": null,
                            "remark": "我是备注",
                            "printCount": 0,
                            "waybillno": "SF1324403762888",
                            "sourceTransferCode": "028",
                            "sourceCityCode": "028",
                            "sourceDeptCode": "",
                            "sourceTeamCode": "",
                            "destCityCode": "028",
                            "destDeptCode": "028",
                            "destDeptCodeMapping": null,
                            "destTeamCode": "",
                            "destTeamCodeMappng": null,
                            "destTransferCode": null,
                            "destRouteLabel": "028",
                            "proName": "",
                            "cargoTypeCode": "C201",
                            "limitTypeCode": "T4",
                            "expressTypeCode": "B1",
                            "expressTypeDesc": "顺丰特快",
                            "codingMapping": "",
                            "codingMappingOut": "",
                            "xbFlag": "0",
                            "printFlag": "000000000",
                            "twoDimensionCode": "MMM={'k1':'028','k2':'028','k3':'','k4':'T4','k5':'SF1324403762888','k6':'','k7':'60d1cf2b'}",
                            "proCode": "特快",
                            "printicon": "00000000",
                            "abFlag": "",
                            "errmsg": "",
                            "destPortCode": "",
                            "destCountry": null,
                            "destPostCode": null,
                            "goodsValueTotal": null,
                            "currencySymbol": "",
                            "goodsNumber": null,
                            "checkCode": "60d1cf2b",
                            "subWaybillNoList": null,
                            "returnTrackNoDetail": null,
                            "codValue": null,
                            "codValueStr": null,
                            "codMonthlyCust": null,
                            "insureValue": null,
                            "insureValueStr": null,
                            "needReturnTrack": null,
                            "returnTrackRequire": null,
                            "electronReceipt": null,
                            "individuationPackageValue": null,
                            "individuationPackageValueStr": null,
                            "isSignAffirm": null,
                            "psign": null,
                            "freight": null
                        },
                        "qrCode": null,
                        "estimateFreight": null
                    }
                ]
            }
            失败报文1

            {
                "code": 1401,
                "success": false,
                "msg": "签名错误",
                "data": null
            }
            失败报文2

            {
                "code": 200,
                "success": true,
                "msg": null,
                "data": [
                    {
                        "customerOrderNo": "O20211108143420888",
                        "success": false,
                        "msg": "托寄物编码2021111001,202111100111,202111100123存在和系统中未签收编码重复;客户订单号已存在;",
                        "printParams": null,
                        "qrCode": null,
                        "estimateFreight": null
                    }
                ]
            } 
            */
        }

        /// <summary>
        /// 创建发函订单接口
        /// 仅向函证通系统下单，不会生成顺丰运单号
        /// 向函证通下单并且向顺丰大网下运单，立即生成顺丰运单号并返回， 可以批量下单接口，如果采用批量下单模式，单次不要超过10单；
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static void HztsaCreateOrder(string partnerID, string checkword, MsgDataRequestHztsaCreateOrder data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            向函证通下单并且向顺丰大网下运单，立即生成顺丰运单号并返回， 可以批量下单接口，如果采用批量下单模式，单次不要超过10单；

            2. 接口定义
            2.2.接口基本信息
            名称	值
            接口服务代码	COM_RECE_HZTSA_CREATE_ORDER
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<http请求头公共参数>

            序号	字段名	类型	必填	描述
            1	appCode	String(36)	是	客户接入标识，由顺丰统一分配
            2	timestamp	String(36)	是	时间戳字符串，时间格式yyyyMMddHHmmssSSS，如20190918185544911
            3	requestId	String(18)	是	接口流水号，18位随机字符串
            2.3. 元素<请求>

            序号	字段名	类型	必填	描述
            1	customerOrderNo	String(36)	是	订单号
            2	sendName	String(36)	是	寄件人姓名
            3	sendTel	String(20)	条件	寄件人联系电话（寄件人固定电话和寄件人联系电话二选一填写）
            4	sendMobile	String(20)	条件	寄件人固定电话（寄件人固定电话和寄件人联系电话二选一填写）
            5	sendAddress	String(200)	是	寄件人详细地址
            6	sendProvince	String(30)	否	寄件人省份
            7	sendCity	String(60)	否	寄件人城市
            8	sendCounty	String(60)	否	寄件人区/县
            9	sendCompany	String(120)	否	寄件公司
            10	receiveName	String(45)	是	收件人姓名
            11	receiveTel	String(20)	条件	收件人联系电话（收件人联系电话和收件人固定电话二选一填写）
            12	receiveMobile	String(20)	条件	收件人固定电话（收件人联系电话和收件人固定电话二选一填写）
            13	receiveAddress	String(200)	是	收件人详细地址
            14	receiveProvince	String(30)	否	收件人省份
            15	receiveCity	String(60)	否	收件人城市
            16	receiveCounty	String(60)	否	收件人区/县
            17	receiveCompany	String(120)	否	收件公司
            18	batchNo	String(30)	否	发函批次号(不填由系统自动生成)
            19	payType	Number(1)	是	付款方式:1:寄付现结 2:寄付月结 3:到付 4:第三方付
            20	monthlyCust	String(36)	条件	月结卡号，寄付月结和第三方付时必填
            21	expressType	String(4)	是	快件产品类别，传值产品编码，详见《附录-2.快件产品类别表》，只有在商务上与顺丰约定的类别方可使用
            22	bspType	Number(1)	是	子母件类型 1：一票一件 2：子母件
            23	isDoCall	Number(1)	否	是否要求通过手持终端通知顺丰收派员收件，1-要求，0-不要求
            24	sendStartTime	String(20)	否	预约上门取件开始时间，格式：YYYY-MM-DD HH24:MM:SS 示例：2012-7-30 09:30:00
            25	productName	String(100)	是	托寄物名称
            26	packageNumber	Number(5)	是	托寄物件数，一个包裹对应一个运单号；若包裹数大于1，则返回一个母运单号和N-1个子运单号
            27	productWeight	Number(10,3)	否	订单货物总重量，包含子母件，单位千克,精确到小数点后3位，如果提供此值,必须>0 。
            28	productCodes	String[ ]	否	托寄物编号集合
            29	bizOrderAddService	BizOrderAddService	否	增值服务
            30	remark	String(200)	否	备注
            31	needQrCode	Number(1)	否	是否需要生成二维码 ，0：否 1：是 ，默认为0，不需要
            32	orgCode	String(30)	否	组织编码
            2.4. 元素<请求>BizOrderAddService

            序号	字段名	类型	必填	描述
            1	codValue	Number(9)	否	代收货款金额（单位：分）
            2	codMonthlyCust	String(36)	条件	代收货款月结卡号(代收货款金额大于0时必填)
            3	insureValue	Number(8)	否	保价金额 (单位：分)
            4	needReturnTrack	Number(1)	否	是否需要签回单 (1-是 0-否)
            5	returnTrackRequire	String(200)	否	回单要求
            6	electronReceipt	String(4)	否	电子签收类型，取值见附录-[电子签收类型]
            7	isSignAffirm	Number(1)	否	是否密钥认证 0-否 1-是
            8	individuationPackageValue	Number(9)	否	个性化包装费用( 单位 分)
            9	psign	String(4)	否	拍照签收类型，1- 身份证，2- 军官证，3- 护照，4- 其他
            10	customizedService	String(30)	否	客制化服务产品编码
            11	customizedServiceParam	String(30)	否	客制化服务参数
            2.5. 元素<响应>

            序号	字段名	类型	必填	描述
            1	code	String(30)	是	响应编码
            2	success	boolean	否	响应结果：true 成功； false 失败
            3	msg	String(200)	是	结果描述
            4	data	String	否	业务处理结果
            2.6. 应用场景(JSON)示例

            请求报文：

            [{
	            "customerOrderNo": "O20211108143666666",
	            "receiveName": "丰一样的男人",
	            "receiveTel": "95338",
	            "receiveAddress": "武侯区创业路111号",
	            "receiveProvince": "四川省",
	            "receiveCity": "成都市",
	            "receiveCounty": "武侯区",
	            "receiveCompany": "四川顺丰速运",
	            "sendName": "顺丰",
	            "sendTel": "95338",
	            "sendAddress": "武侯区创业路1号",
	            "sendProvince": "四川省",
	            "sendCity": "成都市",
	            "sendCounty": "武侯区",
	            "sendCompany": "四川顺丰速运",
	            "batchNo": "2019112801",
	            "payType": 1,
	            "monthlyCust": "9999999999",
	            "expressType": "1",
	            "bspType": 1,
	            "isDoCall": 1,
	            "productName": "文件",
	            "packageNumber": 1,
	            "productWeight": "1.5",
	            "productCodes": [2021111001,202111100111,202111100123],
	            "remark": "我是备注"
            }]
            响应报文:

            ​ 成功响应:

            {
	            "code": 200,
	            "data": [{
		            "customerOrderNo": "O20211108143666666",
		            "success": true
	            }],
	            "success": true
            }
            失败报文1

            {
                "code": 1401,
                "success": false,
                "msg": "签名错误",
                "data": null
            }
            失败报文2

            {
	            "code": 200,
	            "success": true,
	            "msg": null,
	            "data": [{
		            "customerOrderNo": "O20211108143666666",
		            "success": false,
		            "msg": "客户订单号已存在"
	            }]
            }
            */
        }

        /// <summary>
        /// 发运函证订单接口
        /// 发运函证订单
        /// 将已下单的订单发运
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static void HztsaPlaceOrders(string partnerID, string checkword, MsgDataRequestHztsaPlaceOrders data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            将已下单的订单发运

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_HZTSA_PLACE_ORDERS
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<http请求头公共参数>

            序号	字段名	类型	必填	描述
            1	appCode	String(36)	是	客户接入标识，由顺丰统一分配
            2	timestamp	String(36)	是	时间戳字符串，时间格式yyyyMMddHHmmssSSS，如20190918185544911
            3	requestId	String(18)	是	接口流水号，18位随机字符串
            2.3. 元素<请求>

            序号	字段名	类型	必填	描述
            1	orderNo	String(200)	是	订单号，多个以英文逗号隔开，最多支持10个订单
            2.4. 元素<响应>

            序号	字段名	类型	必填	描述
            1	code	String(30)	是	响应编码
            2	success	boolean	否	响应结果：true 成功； false 失败
            3	msg	String(200)	是	结果描述
            4	data	String	否	业务处理结果
            2.5. 应用场景(JSON)示例

            请求报文：

            {"orderNo": "O20211108143666666,O20211108143123456"}
            响应报文:

            成功响应:
            {
	            "code": 200,
	            "data": [{
		            "customerOrderNo": "O20211108143666666",
		            "success": true
	            }],
	            "success": true
            }
            失败报文1

            {
                "code": 1401,
                "success": false,
                "msg": "签名错误",
                "data": null
            }
            失败报文2

            {
	            "code": 200,
	            "success": true,
	            "msg": null,
	            "data": [{
		            "customerOrderNo": "O20211108143666666",
		            "success": false,
		            "msg": "客户订单号的订单状态不满足要求"
	            }]
            }
            */
        }

        /// <summary>
        /// 发运结果推送接口
        /// 函证通主动推送运单号及其他运单详细信息
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static void HztsaPlaceOrderResp(string partnerID, string checkword, MsgDataRequestHztsaPlaceOrderResp data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            推送运单号及其他运单详细信息

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_PUSH_HZTSA_PLACE_ORDER_RESP
            批量交易	不支持
            接口类型	推送
            报文类型	JSON
            2.2. 元素<请求>

            序号	字段名	类型	必填
            1	success	boolean	是否成功
            2	customerOrderNo	String(36)	订单号
            3	PrintParams	printParams	运单信息
            2.3. 元素<请求>PrintParams

            序号	字段名	类型	必填	描述
            1	mainMailNo	String(64)	是	运单号
            2	sendCompany	String(200)	否	寄件公司
            3	sendTel	String(20)	否	寄件电话
            4	sendProvince	String(30)	否	寄件人省份
            5	sendCity	String(60)		寄件人城市
            6	sendCounty	String(60)		寄件人区/县
            7	sendAddress	String(200)		寄件人详细地址
            8	receiveCompany	String(200)		收件人公司
            9	receiveName	String(45)		收件人姓名
            10	receiveTel	String(20)		收件人电话
            11	receiveProvince	String(30)		收件人省份
            12	receiveCity	String(60)		收件人城市
            13	receiveCounty	String(60)		收件人区/县
            14	receiveAddress	String(200)		收件人详细地址
            15	productName	String(100)		托寄物名称
            16	productCode	String[ ]		托寄物编码
            17	packageNumber	Number(5)		包裹数量
            18	productWeight	Number(10,3)		重量
            19	returnTrackNo	String(64)		签回单号
            20	payType	Number(1)		付款方式:1:寄付现结 2:寄付月结 3:到付 4:第三方付
            21	payTypeName	String(20)		付款方式描述
            22	remark	String(200)		备注
            23	printCount	Number(4)		打印次数
            24	sourceTransferCode	String(60)		原寄地中转场
            25	sourceCityCode	String(60)		原寄地城市代码
            26	sourceDeptCode	String(60)		原寄地网点代码
            27	sourceTeamCode	String(60)		原寄地单元区域
            28	destCityCode	String(60)		目的地城市代码
            29	destDeptCode	String(60)		目的地网点代码
            30	destDeptCodeMapping	String(60)		目的地网点代码映射码
            31	destTeamCode	String(60)		目的地单元区域
            32	destTeamCodeMappng	String(60)		目的地单元区域映射码
            33	destTransferCode	String(60)		目的地中转场
            34	destRouteLabel	String(60)		打单时的路由标签信息
            35	proName	String(60)		产品名称
            36	cargoTypeCode	String(60)		快件内容
            37	limitTypeCode	String(60)		时效代码, 如:T4
            38	expressTypeCode	String(60)		产品类型,如:B1
            39	expressTypeDesc	String(60)		产品类型 描述 如顺丰标快
            40	codingMapping	String(60)		入港映射码
            41	codingMappingOut	String(60)		出港映射码
            42	xbFlag	String(60)		XB标志
            43	printFlag	String(60)		打印标志
            44	twoDimensionCode	String(60)		二维码
            45	proCode	String(60)		时效类型T1/T4/T6/T8
            46	printicon	String(60)		打印图标
            47	abFlag	String(60)		AB标
            48	errmsg	String(60)		查询出现异常时返回信息
            49	destPortCode	String(60)		目的地口岸代码
            50	destCountry	String(36)		目的国别(国别代码如:JP)
            51	destPostCode	String(60)		目的地邮编
            52	goodsValueTotal	Number(10,3)		总价值(保留两位小数,数字类型,可补位)
            53	currencySymbol	String(60)		币种
            54	goodsNumber	Number(9)		件数
            55	checkCode	String(60)		根据k1-k6生成的校验码
            56	returnTrackNoDetail	String(60)		签回单的打印信息
            57	codValue	Number(9)		代收货款（单位：分）
            58	codMonthlyCust	String(36)		代收货款月结卡号
            59	insureValue	Number(8)		保价金额（单位：分）
            60	needReturnTrack	Number(1)		是否需要签回单 1-是 0-否
            61	returnTrackRequire	String(200)		回单要求
            62	electronReceipt	String(60)		电子签收类型
            63	individuationPackageValue	Number(9)		个性化包装费用 单位分
            64	isSignAffirm	Number(1)		是否密钥认证 0-否 1-是
            65	psign	String(4)		拍照签收类型，”1”- 身份证，”2”- 军官证，”3”- 护照”，4”- 其他
            2.4. 元素<响应>

            序号	字段名	类型	必填	描述
            1	code	String(30)	是	响应编码
            2	success	boolean	否	响应结果：true 成功； false 失败
            3	msg	String(200)	是	结果描述
            4	data	String	否	业务处理结果
            2.5. 应用场景(JSON)示例

            请求报文：

            {
	            "customerOrderNo": "227419553",
	            "printParams": {
		            "abFlag": "",
		            "cargoTypeCode": "T6",
		            "checkCode": "f3f66e9c",
		            "codingMapping": "E5",
		            "codingMappingOut": "",
		            "currencySymbol": "",
		            "destCityCode": "571",
		            "destDeptCode": "571CS",
		            "destPortCode": "",
		            "destRouteLabel": "571WA-CS-046同",
		            "destTeamCode": "046",
		            "errmsg": "",
		            "expressTypeCode": "B1",
		            "expressTypeDesc": "顺丰标快",
		            "isSignAffirm": 1,
		            "limitTypeCode": "T6",
		            "mainMailNo": "SF1302981298888",
		            "packageNumber": 1,
		            "payType": 2,
		            "printCount": 0,
		            "printFlag": "000000000",
		            "printicon": "00000000",
		            "proCode": "标快",
		            "proName": "",
		            "productName": "文件",
		            "receiveAddress": "四川省成都市武侯区创业路1号",
		            "receiveName": "丰一样的男人",
		            "receiveTel": "13888888888",
		            "returnTrackNo": "",
		            "sendAddress": "广东省深圳市福田区深南大道7008号",
		            "sendName": "张三",
		            "sendTel": "13812345678",
		            "sourceCityCode": "755",
		            "sourceDeptCode": "755AR",
		            "sourceTeamCode": "",
		            "sourceTransferCode": "755W",
		            "twoDimensionCode": "MMM={'k1':'571WA','k2':'571CS','k3':'046','k4':'T6','k5':'SF1302981298888','k6':'','k7':'f3f66e9c'}",
		            "waybillno": "SF1302981298888",
		            "xbFlag": "0"
	            },
	            "success": true
            }
            响应报文:

            ​ 成功响应:

            {"success":true,"msg":""}
            失败报文1

            {
                "code": 1401,
                "success": false,
                "msg": "签名错误",
                "data": null
            }
            */
        }

        /// <summary>
        /// 取消订单接口
        /// 用于取消未揽收和下单异常的订单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static void HztsaCancelOrder(string partnerID, string checkword, MsgDataRequestHztsaCancelOrder data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            用于取消未揽收和下单异常的订单

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_HZTSA_CANCEL_ORDER
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<http请求头公共参数>

            序号	字段名	类型	必填	描述
            1	appCode	String(36)	是	客户接入标识，由顺丰统一分配
            2	timestamp	String(36)	是	时间戳字符串，时间格式yyyyMMddHHmmssSSS，如20190918185544911
            3	requestId	String(18)	是	接口流水号，18位随机字符串
            2.3. 元素<请求>

            序号	字段名	类型	必填	描述
            1	orderNo	String(200)	是	订单号，多个以英文逗号隔开，最多支持10个订单
            2.4. 元素<响应>

            序号	字段名	类型	必填	描述
            1	code	String(30)	是	响应编码
            2	success	boolean	否	响应结果：true 成功； false 失败
            3	msg	String(200)	是	结果描述
            4	data	String	否	业务处理结果
            2.5. 应用场景(JSON)示例

            请求报文：

            {"orderNo": "O20211108143666666,O20211108143123456"}
            响应报文:

            成功响应:
            {
	            "code": 200,
	            "data": [{
		            "customerOrderNo": "O20211108143666666",
		            "success": true
	            }],
	            "success": true
            }
            失败报文1

            {
                "code": 1401,
                "success": false,
                "msg": "签名错误",
                "data": null
            }
            */
        }

        /// <summary>
        /// 物流轨迹查询接口
        /// 运单路由查询
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static void HztsaSeachRoutes(string partnerID, string checkword, MsgDataRequestHztsaSeachRoutes data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            用于物流信息查询，一次请求最多查10个运单

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_HZTSA_SEARCH_ROUTES
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<http请求头公共参数>

            序号	字段名	类型	必填	描述
            1	appCode	String(36)	是	客户接入标识，由顺丰统一分配
            2	timestamp	String(36)	是	时间戳字符串，时间格式yyyyMMddHHmmssSSS，如20190918185544911
            3	requestId	String(18)	是	接口流水号，18位随机字符串
            2.3. 元素<请求>

            序号	字段名	类型	必填	描述
            1	mailNo	String(36)	是	运单号
            2	type	String(6)	是	运单类型，“1”-寄件运单 “2”-到件运单 “3”-外部运单(非顺丰)
            3	expressCode	String(12)	条件	快递公司编码，当运单类型为“外部运单”时需要
            2.4. 元素<响应>公共响应

            序号	字段名	类型	必填	描述
            1	code	String(30)	是	响应编码
            2	success	boolean	否	响应结果：true 成功； false 失败
            3	msg	String(200)	是	结果描述
            4	data	String	否	业务处理结果
            2.5. 元素<业务处理响应>Data

            序号	字段名	类型	必填	描述
            1	mailNo	String(36)	是	运单号
            2	type	String(6)	是	运单类型
            3	success	boolean	是	是否操作成功
            4	msg	String(200)	否	失败信息，success=false时才有值
            5	data	String(600)	否	路由信息，success=true时才有值
            2.6. 元素<业务处理响应>Data

            序号	字段名	类型	必填	描述
            1	acceptAddress	String(200)	否	路由节点发生的地点
            2	acceptTime	String(64)	否	路由节点发生的时间
            3	opcode	String(64)	否	路由节点操作码
            4	remark	String(200)	否	路由节点具体描述
            5	state	String(64)	是	运单快递状态
            2.7. 应用场景(JSON)示例

            请求报文：

            [{
	            "mailNo": "SF1234556888888",
	            "type": "1"
            }, {
	            "mailNo": "SF1000000002666",
	            "type": "2"
            }]
            响应报文:

            ​ 成功响应:

            {
	            "code": 200,
	            "data": [{
		            "data": [{
			            "acceptAddress": "成都市/资阳市/眉山市",
			            "acceptTime": "2021-11-11 01:08:20",
			            "opcode": "30",
			            "remark": "快件在【成都新津中转场】完成分拣,准备发往 【韶关武江集散点】",
			            "state": "运输中"
		            }, {
			            "acceptAddress": "成都市/资阳市/眉山市",
			            "acceptTime": "2021-11-10 21:07:04",
			            "opcode": "31",
			            "remark": "快件到达 【成都新津中转场】",
			            "state": "运输中"
		            }, {
			            "acceptAddress": "成都市/资阳市/眉山市",
			            "acceptTime": "2021-11-10 20:15:53",
			            "opcode": "30",
			            "remark": "快件在【成都市双流县文星镇营业点】完成分拣,准备发往 【成都新津中转场】",
			            "state": "运输中"
		            }, {
			            "acceptAddress": "成都市/资阳市/眉山市",
			            "acceptTime": "2021-11-10 18:39:13",
			            "opcode": "50",
			            "remark": "顺丰速运 已收取快件",
			            "state": "已揽件"
		            }],
		            "mailNo": "SF1234556888888",
		            "success": true,
		            "type": "1"
	            }],
	            "success": true
            }
            失败报文1

            {
                "code": 1401,
                "success": false,
                "msg": "签名错误",
                "data": null
            }
            */
        }

        /// <summary>
        /// 物流轨迹推送接口
        /// 推送顺丰运单路由信息
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static void PushHztsaRoute(string partnerID, string checkword, MsgDataRequestPushHztsaRoute data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            当路由信息产生后，主动推送顺丰运单路由信息

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_PUSH_HZTSA_ROUTE
            批量交易	不支持
            接口类型	推送
            报文类型	JSON
            2.2. 元素<请求>

            序号	字段名	类型	必填	描述
            1	mailNo	String(36)	是	运单号
            2	customerOrderNo	String(64)	否	客户订单号
            3	acceptAddress	String(200)	是	路由节点发生的地点
            4	acceptTime	String(64)	是	路由节点发生的时间
            5	opcode	String(64)	是	路由节点操作码
            6	remark	String(200)	是	路由节点具体描述
            7	state	String(64)	是	运单快递状态
            2.3. 元素<业务处理响应>Data

            序号	字段名	类型	必填	描述
            1	success	boolean	是	是否成功
            2	msg	String(200)	否	异常信息
            2.5. 应用场景(JSON)示例

            请求报文：

            {
	            "acceptAddress": "榆林市",
	            "acceptTime": "2021-11-11 09:58:33",
	            "mailNo": "SF1318169569432",
	            "opCode": "30",
	            "remark": "快件在【榆林榆阳集散点】完成分拣,准备发往 【榆林榆阳榆林大道速运营业点】"
            }
            响应报文:

            ​ 成功响应:

            {"msg":"","success":true}
            失败报文1

            {"msg":"系统异常","success":false}
            */
        }

        /// <summary>
        /// 发函面单推送接口
        /// 推送发件电子面单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static void PushHztsaExpressLetter(string partnerID, string checkword, MsgDataRequestPushHztsaExpressLetter data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            推送发函面单信息

            2. 接口定义
            2.2. 接口基本信息

            名称	值
            接口服务代码	COM_PUSH_HZTSA_EXPRESS_IMG_LETTER
            批量交易	不支持
            接口类型	推送
            报文类型	JSON
            2.2. 元素<请求>
            序号	字段名	类型	必填	描述
            1	mailNo	String(36)	是	运单号
            2	customerOrderNo	String(64)	否	客户订单号
            3	imgCode	String(200)	否	面单图片压缩成(.7z)，再进行AES加密后的字符（success=true时返回）
            4	type	String(64)	是	面单推送类型
            2.3. 元素<业务处理响应>Data
            序号	字段名	类型	必填	描述
            1	success	boolean	是	是否成功
            2	msg	String(200)	否	异常信息
            2.4. 应用场景(JSON)示例
            请求报文：

            {
	            "customerOrderNo": "227519284",
	            "imgCode": "压缩包base64编码",
	            "mailNo": "SF1318879751733",
	            "type": "1"
            }
            响应报文:

            ​ 成功响应:

            {"msg":"","success":true}
            失败报文1

            {"msg":"系统异常,接收失败","success":false}
            2.5. 面单图片解密
            函证系统会对请求或推送的面单图片先压缩成(.7z)，再进行AES加密最终转换为base64字符,一个压缩包最多不超过20张面单图片,压缩文件中图片命名格式：运单号_批次号_日期，可使用以下工具类进行图片解密。

            解密AK：取函证通系统AK的前16个字符作为密钥

            package com.sf.xx;

            import javax.crypto.Cipher;
            import javax.crypto.spec.IvParameterSpec;
            import javax.crypto.spec.SecretKeySpec;
            import java.io.*;
            import java.security.spec.AlgorithmParameterSpec;
            import java.util.Base64;

            //@description : 解密工具类
            public class DecryptUtil
                    {

                        public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";

                public static final String CHAR_SET = "UTF-8";

                public static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };


                        public static String decrypt(String key, String srcFile, String destPath, String fileName)
                        {
                            AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
                            InputStream in = null;
                            FileOutputStream out = null;
                            try
                            {
                                SecretKeySpec newKey = new SecretKeySpec(key.getBytes(CHAR_SET), "AES");
                                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                                cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
                        in = new ByteArrayInputStream(srcFile.getBytes(CHAR_SET));
                        out = new FileOutputStream(destPath + File.separator + fileName);
                                byte[] buffer = new byte[in.available()];
                        in.read(buffer);
                        out.write(cipher.doFinal(Base64.getDecoder().decode(buffer)));
                        out.flush();
                                return destPath + File.separator + fileName;
                            }
                            catch (Exception e)
                            {
                                e.printStackTrace();
                                return null;
                            }
                            finally
                            {
                                if (in != null){
                                    try
                                    {
                                in.close();
                                    }
                                    catch (IOException e)
                                    {
                                        e.printStackTrace();
                                    }
                                }
                                if (out != null){
                                    try
                                    {
                                out.close();
                                    }
                                    catch (IOException e)
                                    {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }
                    }

            */
        }

        /// <summary>
        /// 收发函面单查询接口 COM_RECE_HZTSA_SEARCH_EXPRESS_IMG
        /// 面单查询接口
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static void HztsaSearchExpressImg(string partnerID, string checkword, MsgDataRequestPushHztsaExpressLetter data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            用于查询电子面单图片，一次请求最多查10个运单

            2. 接口定义
            2.1. 接口基本信息
            名称	值
            接口服务代码	COM_RECE_HZTSA_SEARCH_EXPRESS_IMG
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            报文类型	JSON
            2.2. 元素<http请求头公共参数>
            序号	字段名	类型	必填	描述
            1	appCode	String(36)	是	客户接入标识，由顺丰统一分配
            2	timestamp	String(36)	是	时间戳字符串，时间格式yyyyMMddHHmmssSSS，如20190918185544911
            3	requestId	String(18)	是	接口流水号，18位随机字符串
            2.3. 元素<请求>
            序号	字段名	类型	必填	描述
            1	mailNo	String(36)	是	运单号
            2	type	String(6)	是	运单类型，“1”-寄件运单 “2”-到件运单 “3”-外部运单(非顺丰)
            2.4. 元素<响应>公共响应
            序号	字段名	类型	必填	描述
            1	code	String(30)	是	响应编码
            2	success	boolean	否	响应结果：true 成功； false 失败
            3	msg	String(200)	是	结果描述
            4	data	String	否	业务处理结果
            2.5. 元素<业务处理响应>Data
            序号	字段名	类型	必填	描述
            1	imgCode	String	是	面单图片压缩成(.7z)，再进行AES加密后的字符（success=true时返回）
            2	success	boolean	是	是否操作成功
            2.6. 应用场景(JSON)示例
            请求报文：

            [{
	            "mailNo": "SF1308812899999",
	            "type": "1"
            }]
            响应报文:

            ​ 成功响应:

            {
	            "code": 200,
	            "data": {
                        "imgCode": "图片压缩包base64编码",
		               "success": true
	            },
	            "success": true
            }
            失败报文1

            {
                "code": 1401,
                "success": false,
                "msg": "签名错误",
                "data": null
            }
            2.6. 面单图片解密
            函证系统会对请求或推送的面单图片先压缩成(.7z)，再进行AES加密最终转换为base64字符,一个压缩包最多不超过20张面单图片,压缩文件中图片命名格式：运单号_批次号_日期，可使用以下工具类进行图片解密。

            解密AK：取函证通系统AK的前16个字符作为密钥

            package com.sf.xx;

            import javax.crypto.Cipher;
            import javax.crypto.spec.IvParameterSpec;
            import javax.crypto.spec.SecretKeySpec;
            import java.io.*;
            import java.security.spec.AlgorithmParameterSpec;
            import java.util.Base64;

            //@description : 解密工具类
            public class DecryptUtil
                    {

                        public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";

                public static final String CHAR_SET = "UTF-8";

                public static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };


                        public static String decrypt(String key, String srcFile, String destPath, String fileName)
                        {
                            AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
                            InputStream in = null;
                            FileOutputStream out = null;
                            try
                            {
                                SecretKeySpec newKey = new SecretKeySpec(key.getBytes(CHAR_SET), "AES");
                                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                                cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
                        in = new ByteArrayInputStream(srcFile.getBytes(CHAR_SET));
                        out = new FileOutputStream(destPath + File.separator + fileName);
                                byte[] buffer = new byte[in.available()];
                        in.read(buffer);
                        out.write(cipher.doFinal(Base64.getDecoder().decode(buffer)));
                        out.flush();
                                return destPath + File.separator + fileName;
                            }
                            catch (Exception e)
                            {
                                e.printStackTrace();
                                return null;
                            }
                            finally
                            {
                                if (in != null){
                                    try
                                    {
                                in.close();
                                    }
                                    catch (IOException e)
                                    {
                                        e.printStackTrace();
                                    }
                                }
                                if (out != null){
                                    try
                                    {
                                out.close();
                                    }
                                    catch (IOException e)
                                    {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }
                    }
            */
        }

        #endregion 函证通服务类接口

        #region 托寄物标准服务类接口

        #endregion 托寄物标准服务类接口

        #region 月结管家服务类接口

        /// <summary>
        /// 查询月结码使用信息接口
        /// 根据月结码加密串查询月结码扫描使用信息
        /// 该接口用于:
        /// -根据月结码加密串查询月结码扫描使用信息。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult AcspQueryMonthlyCodeScanInfo(string partnerID, string checkword, MsgDataRequestAcspQueryMonthlyCodeScanInfo data, string accessToken = "", string environment = "sfapi")
        {
            /* 
            1. 功能描述
            该接口用于:
            -根据月结码加密串查询月结码扫描使用信息。

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_ACSP_QUERY_MONTHLY_CODE_SCAN_INFO
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（ACSP_QUERY_MONTHLY_CODE_SCAN_INFO ）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	Number	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	uuid	String(40)	是	月结码加密串
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "uuid": "0DCC06EBC7914A48B5CD62E3DC129AD1"
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	Boolean	是	是否处理成功
            2	errorCode	String(20)	否	错误代码
            3	errorMessage	String(200)	否	错误信息
            4	obj	QueryMonthlyCodeScanInfoResp	否	月结码扫描使用信息
            响应参数<obj>
            序号	参数列表	类型	是否必传	含义
            1	monthCard	String(10)	是	月结卡号
            2	waybillNo	String(15000)	是	运单号（多个用英文逗号分开）
            3	dynamicCode	String(10)	否	动态码
            4	remark	String(30)	否	备注
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": null,
                "errorMessage": null
                "obj": {
                    "monthCard": "7553017474",
                    "waybillNo": "SF1000188492105",
                    "dynamicCode": null,
                    "remark": "备注abc"
                }
            }
            失败响应:-范例1
            {
                "success":false,
                "errorCode": "A000006",
                "errorMessage": "该加密串未被使用",
                "obj":null
            }
            失败响应:-范例2
            {
                "success":false,
                "errorCode":"A000005",
                "errorMessage":"越权使用该月结卡号",
                "obj":null
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            A000001	必填参数不能为空	系统错误
            A000002	失效时间必须大于0	系统错误
            A000003	未找到该月结卡号	系统错误
            A000004	该月结卡号不是有效的	系统错误
            A000005	越权使用该月结卡号	系统错误
            A000006	该加密串未被使用	系统错误
            A000007	未找到该加密串的相关信息	系统错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_ACSP_QUERY_MONTHLY_CODE_SCAN_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseAcspQueryMonthlyCodeScanInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 大同城创建订单
        /// 该接口用于:
        /// 创建货运订单
        /// 注意事项：该接口涉及月结，费用等金额相关请仔细核实对应参数。您可以联系您的客户经理或IT服务顾问申请处理；顺丰内部对接可丰声/邮件联系01423615沟通申请权限；
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult CityWideOrderCreate(string partnerID, string checkword, MsgDataRequestCityWideOrderCreate data, string accessToken = "", string environment = "sfapi")
        {
            /* 
            1. 功能描述
            该接口用于:
            创建货运订单

            注意事项：该接口涉及月结，费用等金额相关请仔细核实对应参数。您可以联系您的客户经理或IT服务顾问申请处理；顺丰内部对接可丰声/邮件联系01423615沟通申请权限；

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_CITYWIDE_ORDER_CREATE
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_CITYWIDE_ORDER_CREATE ）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	Number	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	source	String(64)	是	系统来源，固定值：CITYWIDE_BSP
            2	payType	Int	是	支付方式 2-寄付月结，3-到付
            3				
            20	pricingManner	String(64)	是	计价方式
            4	orderCreateUid	String(64)	是	创建订单uid 每次请求唯一
            5	vehicleTypeName	String(64)	是	车辆类型名称
            6	cargoName	String(64)	是	货物名称
            7	cargoNum	Int	是	货物数量
            8	cargoVolume	Double	是	创货物体积
            9	cargoWidth	Double	是	货物重量
            10	cargoLength	Double	否	货物长
            11	cargoWeight	Double	否	货物宽
            12	cargoHeight	Double	否	货物高
            13	orderContactorName	String(64)	是	订单联系人姓名
            14	orderContactorMobile	String(64)	是	订单联系人手机号
            15	recommendWorkerNo	String(64)	否	推荐小哥工号 如果要填，必须8位数
            16	remark	String(64)	否	备注
            17	basicCoverageAmount	Double	否	基础保费金额
            18	paperReceipt	Boolean	否	是否纸质回单 true 是 false 否
            19	returnFee	Double	否	返程费
            20	pricingManner	String(64)	是	计价方式
            21	customerFee	Double	是	客户出价金额
            22	exceptedLoad	Boolean	是	预计装货时间类型 true-预计用车 false-立即用车， 默认false
            23	exceptedLoadTime	String(64)	否	预计装货时间 当exceptedLoad为true ，字段必填格式yyyy-MM-dd HH:mm:ss 必须大于当前时间
            24	orderChannel	String(64)	是	订单渠道，传系统编码
            25	bspOrderWaypointList	List<BspOrderWaypoint>	是	收发货/经停点地址 注意顺序号，第一个是 发货地，最后一个是收货地 最少为2条，最多12 条
            26	BspOrderWaypoint.serialNo	Int	是	序号
            27	BspOrderWaypoint.contactorName	String(64)	是	联系人姓名
            28	BspOrderWaypoint.contactorMobile	String(64)	是	联系人手机号
            29	BspOrderWaypoint.detailAddress	String(64)	是	详细地址 省市区 街道门牌号 详细地址
            30	session	Session	是	session
            31	session.userMobile	String(20)	是	手机号码
            32	session.userMobile	String(20)	是	手机号码
            32	session.userName	String(20)	是	用户名称
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "session": {

                    "userMobile": "136****8952",
                    "userName": "一花一树",
                    "superAdmin": false
                },
                "source": "CITYWIDE_BSP",
                "orderCreateUid": "5f4df58b-396e-42f5-9246-698b88d89301",
                "payType": 2,
                "payMonthCard": "755****229",
                "vehicleScene": 0,
                "vehicleTypeCode": "101",
                "vehicleTypeId": "101-1.4",
                "vehicleTypeName": "微面",
                "vehicleLength": "1.4",
                "cargoName": "服装鞋帽",
                "cargoNum": 1,
                "cargoWeight": 1,
                "cargoVolume": 1,
                "bspOrderWaypointList": [
                    {
                        "serialNo": 0,
                        "contactorName": "陈",
                        "contactorMobile": "158****9737",
                        "detailAddress": "广东省深圳市南山区南头街道南头城社区南山大道3047-3049号商铺"
                    },
                    {
                        "serialNo": 1,
                        "contactorName": "陈楚川",
                        "contactorMobile": "135****0537",
                        "detailAddress": "广东省深圳市福田区侨香路与农林路交界东南的深国投商业中心一层二层与负一楼"
                    }
                ],
                "basicCoverageAmount": "200",
                "paperReceipt": false,
                "returnFee": null,
                "exceptedLoad": true,
                "exceptedLoadTime": "2024-10-12 17:50:00",
                "orderContactorName": "",
                "orderContactorMobile": "188****1603",
                "exceptedDriverName": "",
                "exceptedDriverMobile": "136****6873",
                "remark": "测试",
                "orderChannel":"BSP"
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	Boolean	是	是否处理成功
            2	errorCode	String(20)	否	错误代码
            3	errorMessage	String(200)	否	错误信息
            响应参数<obj>
            序号	参数列表	类型	含义
            1	orderNo	String	订单编号 例 ：SCNO1840675113524264960541
            2	orderResult	Integer	下单结果，0-成功，1-失败，2-指定司机失败
            3	waybillNo	String	运单号 例：SF1650011283050
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "success": true,
              "obj": {
                "orderResult": 0,
                "waybillNo": "SF1650011283050",
                "orderNo": "SCNO1840675113524264960541"
              }
            }
            失败响应:-范例1
            {
                "success": false,
                "errorCode": "000000",
                "errorMessage": "系统异常！"
            }
            失败响应:-范例2
            {
                "success": false,
                "errorCode": "000001",
                "errorMessage": "orderChannel:订单渠道不能为空;"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            A000001	必填参数不能为空	系统错误
            A000002	失效时间必须大于0	系统错误
            A000003	未找到该月结卡号	系统错误
            A000004	该月结卡号不是有效的	系统错误
            A000005	越权使用该月结卡号	系统错误
            A000006	该加密串未被使用	系统错误
            A000007	未找到该加密串的相关信息	系统错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_CITYWIDE_ORDER_CREATE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseCityWideOrderCreate>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 生成月结码接口
        /// 根据月结卡号生成月结码相关信息
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult AcspCreateMonthlyCode(string partnerID, string checkword, MsgDataRequestAcspCreateMonthlyCode data, string accessToken = "", string environment = "sfapi")
        {
            /* 
            1. 功能描述
            该接口用于:
            -根据月结卡号生成月结码相关信息。

            注意事项：该接口涉及月结卡号安全权限，调用方在接入前需与接口提供方进行充分沟通后再进行对接；如您为月结卡号使用者，您可以联系您的客户经理或IT服务顾问申请处理；顺丰内部对接可丰声/邮件联系01413596/40940658沟通申请权限；

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_ACSP_CREATE_MONTHLY_CODE
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（ACSP_CREATE_MONTHLY_CODE ）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	Number	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	monthCard	String(10)	是	月结卡号
            2	timeout	Int	否	失效时间, 单位: 秒, 若不传则 300 秒
            3	needDynamicCode	Boolean	否	是否需要生成动态码，默认否
            4	mobile	String(20)	否	手机号
            5	remark	String(30)	否	备注
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "monthCard":"7553017474",
                "needDynamicCode": true,
                "remark":"备注abc"
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	Boolean	是	是否处理成功
            2	errorCode	String(20)	否	错误代码
            3	errorMessage	String(200)	否	错误信息
            4	obj	CreateMonthlyCodeResp	否	月结码信息
            响应参数<obj>
            序号	参数列表	类型	是否必传	含义
            1	uuid	String(40)	是	月结码加密串
            2	dynamicCode	String(10)	否	动态码，只有入参needDynamicCode=true，才会返回此字段
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": null,
                "errorMessage": null
                "obj": {
                    "uuid": "35A3F233E245405EB4E70369FC4C112D",
                    "dynamicCode": "33524478"
                }
            }
            失败响应:-范例1
            {
                "success":false,
                "errorCode":"A000001",
                "errorMessage":"月结卡号不能为空",
                "obj":null
            }
            失败响应:-范例2
            {
                "success":false,
                "errorCode":"A000002",
                "errorMessage":"失效时间必须大于0",
                "obj":null
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            A000001	必填参数不能为空	系统错误
            A000002	失效时间必须大于0	系统错误
            A000003	未找到该月结卡号	系统错误
            A000004	该月结卡号不是有效的	系统错误
            A000005	越权使用该月结卡号	系统错误
            A000006	该加密串未被使用	系统错误
            A000007	未找到该加密串的相关信息	系统错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_ACSP_CREATE_MONTHLY_CODE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseAcspCreateMonthlyCode>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 大同城订单详情
        /// 该接口用于:
        /// 查询创建的订单信息
        /// 注意事项：查询创建的订单信息。您可以联系您的客户经理或IT服务顾问申请处理；顺丰内部对接可丰声/邮件联系01423615沟通申请权限；
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult CityWideOrderDetail(string partnerID, string checkword, MsgDataRequestCityWideOrderDetail data, string accessToken = "", string environment = "sfapi")
        {
            /* 
            1. 功能描述
            该接口用于:
            查询创建的订单信息

            注意事项：查询创建的订单信息。您可以联系您的客户经理或IT服务顾问申请处理；顺丰内部对接可丰声/邮件联系01423615沟通申请权限；

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_CITYWIDE_ORDER_DETAIL
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（ACSP_CREATE_MONTHLY_CODE ）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	Number	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	waybillNo	String(10)	是	运单号 例： SF1610041150830
            2	source	String(64)	是	系统来源，固定值：CITYWIDE_BSP
            3	session	Object	是	session
            4	userMobile	String(20)	是	手机号码
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "waybillNo": "SF1670024091033",
                "source":"CITYWIDE_BSP",
                "session":{
                    "userMobile":"188****1603"
                }
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	Boolean	是	是否处理成功
            2	errorCode	String(20)	否	错误代码
            3	errorMessage	String(200)	否	错误信息
            响应参数<obj>
            序号	参数列表	类型	含义
            1	orderNo	String	订单号
            2	waybillNo	String	运单号
            3	teamCode	String	所属区域-分部编码
            4	teamName	String	所属区域-分部名称
            5	deptCode	String	所属区域-网点编码
            6	deptName	String	所属区域-网点名称
            7	orderStatus	String	订单状态 见下述枚举
            8	vehicleTypeName	String	车辆类型名称
            9	cargoTypeCode	String	货物信息编码
            10	additionKey	List<String>	增值服务集合
            11	frontFee	Double	实际运费
            12	frontFeeType	Integer	运费计算类型 1-系统 2-客户
            13	frontAdditionFee	Double	前置增值服务费
            14	frontAdditionListFee	List<OrderAdditionFeeResponse>	前置增值服务费明细
            15	frontTolFee	Double	基本路费
            16	postAdditionFee	Double	后置增值服务费
            17	postAdditionListFee	List<OrderAdditionFeeResponse>	后置费用服务明细
            18	approveStatus	String	后置增值服务费 见下述枚举
            19	payStatus	Integer	支付状态 见下述枚举
            20	orderCombineStatus	String	订单的组合状态
            21	tolFee	Double	总费用合计
            22	payFee	Double	实际支付
            23	paymentTypeCode	Integer	支付类型编码，1-寄付，2-到付，3-第三方付
            24	settlementTypeCode	Integer	结算类型编码，1-现结，2-月结
            25	payType	Integer	支付类型，1-寄付现结，2-寄付月结，3-到付现结
            26	monthCard	String	客户月结卡号
            27	orderContactorMobile	String	订单联系人手机号
            28	orderContactorMobileEncrypt	String	订单联系人手机号
            29	proxyCreatorId	String	代下单人手机号
            30	proxyCreatorIdEncrypt	String	代下单人手机号
            31	driverName	String	指定司机姓名
            32	driverId	String	指定司机id，手机号
            33	driverIdEncrypt	String	加密指定司机id，手机号
            34	realDriverName	String	实际司机姓名
            35	realDriverId	String	实际司机id，手机号
            36	realDriverIdEncrypt	String	加密实际司机id，手机号
            37	plateNumber	String	车牌号
            38	orderCreateTime	Date	下单时间
            39	payDeadlineTime	Date	支付截止时间
            40	senderWaypoint	OrderWaypointResponse	寄件地址信息
            41	orderWaypoints	List<OrderWaypointResponse>	收件以及经停地址信息
            42	totalDistance	Double	距离，单位km
            43	orderTime	Date	用车时间(yyyy-MM-dd HH:mm)
            44	orderTimeYyyyMMddHHmmss	Date	用车时间(yyyy-MM-dd HH:mm:ss)
            45	collectWorkerName	String	揽收小哥
            46	collectWorkerNo	String	揽收小哥工号
            46	recommendWorkerName	String	推荐小哥
            47	recommendWorkerNo	String	推荐小哥工号
            48	orderSysSource	String	下单渠道 CITYWIDE_APP-小程序 CITYWIDE_MANAGE-后台 CITYWIDE_BSP bsp端
            49	name	String	货物名称
            50	num	Integer	货物数量
            51	weight	Double	货物重量，kg
            52	volume	Double	货物体积,m3
            53	vehicleScene	Integer	用车场景，0-即时用车，1-计划用车
            54	remark	String	备注
            55	realCreatorName	String	创建人名称
            56	realCreatorId	String	创建人，用户手机号/下单小哥工号
            57	realCreatorIdEncrypt	String	创建人，用户手机号/下单小哥工号
            58	createTime	Date	创建时间
            59	signbackWaybillNo	String	回单号
            60	driverIsCollect	Boolean	司机是否收藏
            61	vehicleSerialNo	String	车牌号
            62	orderRouteList	List<OrderRouteResponse>	路由信息
            63	lastOrderRoute	OrderRouteResponse	最后的路由信息
            64	discountFeeList	List<OrderDiscountFeeResponse>	优惠费抵扣明细费用
            65	discountAmount	Double	展示优惠金额
            66	isEvaluate	Boolean	是否评价
            67	isOverEvaluateTime	Boolean	是否超过评价时间
            响应参数<OrderAdditionFeeResponse>
            序号	参数列表	类型	含义
            1	additionKey	String	增值服务
            2	additionKeyFee	String	增值服务费用
            3	serviceCode	String	增值服务编码
            4	serviceSubCode	String	增值服务子编码
            响应参数<OrderWaypointResponse>
            序号	参数列表	类型	含义
            1	type	Integer	经停类型，0-起点，1-终点，2-中转
            2	serialNo	Integer	序号
            3	contactorName	String	联系人姓名
            4	contactorMobile	String	联系人电话
            5	contactorMobileEncrypt	String	加密联系人电话
            6	provinceName	String	省
            7	cityName	String	市
            8	areaName	String	区县
            9	detailAddress	String	详细地址
            10	teamCode	String	分部编码
            11	deptCode	String	网点编码
            响应参数<OrderRouteResponse>
            序号	参数列表	类型	含义
            1	routeContent	String	路由内容
            2	routeTime	Date	路由时间
            3	baseUrls	List<String>	图片信息
            响应参数<OrderDiscountFeeResponse>
            序号	参数列表	类型	含义
            1	key	String	费用名称
            2	amount	Double	展示优惠金额,精度低
            3	originalAmount	BigDecimal	原始优惠金额,精度高
            订单状态枚举<orderStatus>
            枚举值	描述
            -2	失败
            -1	草稿
            0	待接单
            1	待执行
            2	前往装货地
            3	装货中
            4	运输中
            5	司机已完成
            6	已取消
            80	已完成
            后置费用支付状态枚举<approveStatus>
            枚举值	描述
            0	未发生
            1	已发生，待支付
            2	已发生，已支付
            3	已发生，已驳回
            4	已发生，已关闭
            支付状态枚举<approveStatus>
            枚举值	描述
            0	待支付
            1	已支付
            2	已取消
            3	退款中
            4	已退款
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "success": true,
              "obj": {
                "orderNo": "SCNO1839541135054401536519",
                "waybillNo": "SF1610041150830",
                "teamCode": "755FTM",
                "teamName": "福田片区",
                "deptCode": "755A",
                "deptName": "车信息化测试营业点",
                "orderStatus": "6",
                "vehicleTypeName": "微面",
                "cargoTypeCode": "SP68",
                "additionKey": [
                  "保费",
                  "返程费"
                ],
                "frontFee": 58,
                "frontFeeType": 1,
                "frontAdditionFee": 1.01,
                "frontAdditionListFee": [
                  {
                    "additionKey": "保费",
                    "additionKeyFee": 0.01,
                    "serviceCode": "IN02",
                    "serviceSubCode": ""
                  },
                  {
                    "additionKey": "返程费",
                    "additionKeyFee": 1,
                    "serviceCode": "IN200",
                    "serviceSubCode": "IN200-0246"
                  }
                ],
                "frontTolFee": 59.01,
                "postAdditionFee": 0,
                "postAdditionListFee": [],
                "approveStatus": "0",
                "payStatus": 1,
                "orderCombineStatus": "10",
                "tolFee": 59.01,
                "payFee": 59.01,
                "paymentTypeCode": 1,
                "settlementTypeCode": 2,
                "payType": 2,
                "monthCard": "755****666",
                "orderContactorMobile": "188****1603",
                "orderContactorMobileEncrypt": "DEEQAVThrNIY7UrEG2qXLRdof1KaI%3D",
                "proxyCreatorId": "",
                "driverId": "136****6873",
                "driverIdEncrypt": "DEEQAVTnSvUjxTjO62rwqgBglqA4Y%3D",
                "realDriverName": "干曦晴",
                "realDriverId": "136****6873",
                "realDriverIdEncrypt": "DEEQAVTnSvUjxTjO62rwqgBglqA4Y%3D",
                "plateNumber": "粤T66630",
                "orderCreateTime": "2024-09-27 13:42:38",
                "payDeadlineTime": "2024-09-27 13:57:38",
                "senderWaypoint": {
                  "serialNo": 0,
                  "contactorName": "测试下",
                  "contactorMobile": "158****9737",
                  "contactorMobileEncrypt": "DEEQAVTmULS7nK%2BKHPQYSLEuUo93I%3D",
                  "provinceName": "广东省",
                  "cityName": "深圳市",
                  "areaName": "南山区",
                  "detailAddress": "粤海街道观海台2栋",
                  "deptCode": "755A"
                },
                "orderWaypoints": [
                  {
                    "serialNo": 1,
                    "contactorName": "测试下",
                    "contactorMobile": "158****9737",
                    "contactorMobileEncrypt": "DEEQAVTmULS7nK%2BKHPQYSLEuUo93I%3D",
                    "provinceName": "广东省",
                    "cityName": "深圳市",
                    "areaName": "福田区",
                    "detailAddress": "广东省深圳市福田区侨香路与农林路交界东南的深国投商业中心一层二层与负一楼",
                    "deptCode": "755A"
                  }
                ],
                "orderTime": "2024-09-27 13:42",
                "orderTimeYyyyMMddHHmmss": "2024-09-27 13:42:38",
                "collectWorkerName": "朱**",
                "collectWorkerNo": "",
                "recommendWorkerNo": "",
                "orderSysSource": "CITYWIDE_APP",
                "name": "服装鞋帽",
                "num": 1,
                "weight": 1,
                "volume": 1,
                "vehicleScene": 0,
                "remark": "测试",
                "realCreatorName": "一花一树",
                "realCreatorId": "188****1603",
                "realCreatorIdEncrypt": "DEEQAVThrNIY7UrEG2qXLRdof1KaI%3D",
                "createTime": "2024-09-27 13:42:38",
                "driverIsCollect": false,
                "vehicleSerialNo": "",
                "orderRouteList": [
                  {
                    "routeContent": "司机已接单",
                    "routeTime": "2024-09-27 13:43:24"
                  },
                  {
                    "routeContent": "创建订单",
                    "routeTime": "2024-09-27 13:42:40"
                  }
                ],
                "lastOrderRoute": {
                  "routeContent": "司机已接单",
                  "routeTime": "2024-09-27 13:43:24"
                },
                "discountFeeList": [],
                "discountAmount": 0,
                "isEvaluate": false,
                "isOverEvaluateTime": false
              }
            }
            失败响应:-范例1
            {
                "success": false,
                "errorCode": "081002",
                "errorMessage": "无当前操作的数据权限"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            A000001	必填参数不能为空	系统错误
            A000002	失效时间必须大于0	系统错误
            A000003	未找到该月结卡号	系统错误
            A000004	该月结卡号不是有效的	系统错误
            A000005	越权使用该月结卡号	系统错误
            A000006	该加密串未被使用	系统错误
            A000007	未找到该加密串的相关信息	系统错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_CITYWIDE_ORDER_DETAIL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseCityWideOrderDetail>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 大同城取消订单
        /// 订单完成后，存在后置费用，对该费用进行确认
        /// 注意事项：该接口涉及后置费用，得存在后置费用才可正常使用。您可以联系您的客户经理或IT服务顾问申请处理；顺丰内部对接可丰声/邮件联系01423615沟通申请权限；
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult CityWideOrderCancel(string partnerID, string checkword, MsgDataRequestCityWideOrderCancel data, string accessToken = "", string environment = "sfapi")
        {
            /* 
            1. 功能描述
            该接口用于:
            订单完成后，存在后置费用，对该费用进行确认

            注意事项：该接口涉及后置费用，得存在后置费用才可正常使用。您可以联系您的客户经理或IT服务顾问申请处理；顺丰内部对接可丰声/邮件联系01423615沟通申请权限；

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_CITYWIDE_ORDER_CANCEL
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_CITYWIDE_ORDER_CANCEL ）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	Number	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	waybillNo	String(64)	是	运单号 例： SF1610041150830
            2	source	String(64)	是	系统来源，固定值：CITYWIDE_BSP
            3	session	Object	是	session
            4	userMobile	String(20)	是	手机号码
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "waybillNo": "SF1011867633281",
                "source": "CITYWIDE_BSP",
                "session": {
                    "userMobile": "188****1603"
                }
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	Boolean	是	是否处理成功
            2	errorCode	String(20)	否	错误代码
            3	errorMessage	String(200)	否	错误信息
            响应参数<obj>
            无

            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "success": true
            }
            失败响应:-范例1
            {
                "success": false,
                "errorCode": "030082",
                "errorMessage": "消单状态异常"
            }
            失败响应:-范例2
            {
                "success": false,
                "errorCode": "081002",
                "errorMessage": "无当前操作的数据权限"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            A000001	必填参数不能为空	系统错误
            A000002	失效时间必须大于0	系统错误
            A000003	未找到该月结卡号	系统错误
            A000004	该月结卡号不是有效的	系统错误
            A000005	越权使用该月结卡号	系统错误
            A000006	该加密串未被使用	系统错误
            A000007	未找到该加密串的相关信息	系统错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_CITYWIDE_ORDER_CANCEL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseCityWideOrderCancel>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 大同城订单后置费用确认并支付
        /// 订单完成后，存在后置费用，对该费用进行确认
        /// 注意事项：该接口涉及后置费用，得存在后置费用才可正常使用。您可以联系您的客户经理或IT服务顾问申请处理；顺丰内部对接可丰声/邮件联系01423615沟通申请权限；
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult CityWideOrderConfirm(string partnerID, string checkword, MsgDataRequestCityWideOrderConfirm data, string accessToken = "", string environment = "sfapi")
        {
            /* 
            1. 功能描述
            该接口用于:
            订单完成后，存在后置费用，对该费用进行确认

            注意事项：该接口涉及后置费用，得存在后置费用才可正常使用。您可以联系您的客户经理或IT服务顾问申请处理；顺丰内部对接可丰声/邮件联系01423615沟通申请权限；

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_CITYWIDE_ORDER_CONFIRM
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_CITYWIDE_ORDER_CONFIRM ）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	Number	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	waybillNo	String(10)	是	运单号 例： SF1610041150830
            2	source	String(64)	是	系统来源，固定值：CITYWIDE_BSP
            3	session	Object	是	session
            4	userMobile	String(20)	是	手机号码
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "waybillNo": "SF1011867633281",
                "source": "CITYWIDE_BSP",
                "session": {
                    "userMobile": "188****1603"
                }
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	Boolean	是	是否处理成功
            2	errorCode	String(20)	否	错误代码
            3	errorMessage	String(200)	否	错误信息
            响应参数<obj>
            无

            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "success": true
            }
            失败响应:-范例1
            {
                "success": false,
                "errorCode": "040006",
                "errorMessage": "无后置费用"
            }
            失败响应:-范例2
            {
                "success": false,
                "errorCode": "081002",
                "errorMessage": "无当前操作的数据权限"
            }
            失败响应:-范例3
            {
                "success": false,
                "errorCode": "040005",
                "errorMessage": "后置费用已确认支付"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            A000001	必填参数不能为空	系统错误
            A000002	失效时间必须大于0	系统错误
            A000003	未找到该月结卡号	系统错误
            A000004	该月结卡号不是有效的	系统错误
            A000005	越权使用该月结卡号	系统错误
            A000006	该加密串未被使用	系统错误
            A000007	未找到该加密串的相关信息	系统错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_CITYWIDE_ORDER_CONFIRM";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseCityWideOrderConfirm>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 大同城订单后置费用驳回
        /// 订单完成后，存在后置费用，对该费用存在疑问并驳回该费用
        /// 注意事项：该接口涉及后置费用，得存在后置费用才可正常使用。您可以联系您的客户经理或IT服务顾问申请处理；顺丰内部对接可丰声/邮件联系01423615沟通申请权限；
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult CityWideOrderReject(string partnerID, string checkword, MsgDataRequestCityWideOrderReject data, string accessToken = "", string environment = "sfapi")
        {
            /* 
            1. 功能描述
            该接口用于:
            订单完成后，存在后置费用，对该费用存在疑问并驳回该费用

            注意事项：该接口涉及后置费用，得存在后置费用才可正常使用。您可以联系您的客户经理或IT服务顾问申请处理；顺丰内部对接可丰声/邮件联系01423615沟通申请权限；

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_CITYWIDE_ORDER_REJECT
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_CITYWIDE_ORDER_REJECT ）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	Number	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	waybillNo	String(10)	是	运单号 例： SF1610041150830
            2	rejectCause	String(64)	是	驳回原因
            3	source	String(64)	是	系统来源，固定值：CITYWIDE_BSP
            4	session	Object	是	session
            5	userMobile	String(20)	是	手机号码
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "waybillNo": "SF1011867633281",
                "rejectCause":"这金额不正确",
                "source": "CITYWIDE_BSP",
                "session": {
                    "userMobile": "188****1603"
                }
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	Boolean	是	是否处理成功
            2	errorCode	String(20)	否	错误代码
            3	errorMessage	String(200)	否	错误信息
            响应参数<obj>
            无

            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "success": true
            }
            失败响应:-范例1
            {
                "success": false,
                "errorCode": "040006",
                "errorMessage": "无后置费用"
            }
            失败响应:-范例2
            {
                "success": false,
                "errorCode": "081002",
                "errorMessage": "无当前操作的数据权限"
            }
            失败响应:-范例3
            {
                "success": false,
                "errorCode": "040005",
                "errorMessage": "后置费用已确认支付"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            A000001	必填参数不能为空	系统错误
            A000002	失效时间必须大于0	系统错误
            A000003	未找到该月结卡号	系统错误
            A000004	该月结卡号不是有效的	系统错误
            A000005	越权使用该月结卡号	系统错误
            A000006	该加密串未被使用	系统错误
            A000007	未找到该加密串的相关信息	系统错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_CITYWIDE_ORDER_REJECT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseCityWideOrderReject>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 月结管家服务类接口

        #region 电商退货服务类接口

        /// <summary>
        /// 快递标准订单创建接口
        /// 电退-退货订单创建接口
        /// 该接口用于:
        /// 1.客户系统向顺丰下发订单
        /// 2.为订单分配运单号
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult CreateOrder(string partnerID, string checkword, MsgDataRequestCreateOrder data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            该接口用于:
            1.客户系统向顺丰下发订单
            2.为订单分配运单号

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	EXP_RECE_CREATE_ORDER
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（EXP_RECE_CREATE_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            元素<请求>Order

            序号	参数列表	类型	是否必传	含义
            1	language	String(10)	是	响应报文的语言，缺省值为zh-CN，目前支持以下值zh-CN表示中文简体，zh-TW或zh-HK或zh-MO表示中文繁体，en表示英文
            2	orderId	String(64)	是	客户订单号
            3	cargoDetails	List<CargoDetail>	是	拖寄物信息
            4	cargoDesc	String(20)	否	拖寄物类型描述,如：文件，电子产品，衣服等
            5	extraInfoList	List<ExtraInfo>	条件	扩展属性（若存在电商平台抵扣金额，必传拓展字段）
            6	serviceList	List<Service>	条件	增值服务信息
            7	contactInfoList	List<ContactInfo>	是	收寄双方信息
            8	monthlyCard	String(20)	条件	顺丰月结卡号–请与业务方确认月结卡号信息。
            9	payMethod	Number (2)	是	付款方式，支持以下值：1:寄方付 2:收方付 3:第三方付
            10	expressTypeId	Number (5)	是	快件产品类别，支持附录《快件产品类别表》的产品编码值，仅可使用与顺丰销售约定的快件产品。电商退货产品传固定值236
            11	parcelQty	Number(5)	条件	包裹数（默认1），一个包裹对应一个运单号；若包裹数大于1，则返回一个母运单号和N-1个子运单号。
            12	sendStartTm	Date	条件	要求上门取件开始时间，格式：YYYY-MM-DD HH24:MM:SS，示例：2012-7-30 09:30:00。预约单传预约截止时间 不赋值默认按当前时间下发，1小时内取件
            13	isDocall	Number (1)	是	是否通过手持终端通知顺丰收派员上门收件，支持以下值：1：要求 0：不要求 (默认0) *电商退货固定传1
            14	orderSource	String(50)	否	订单平台类型（对于平台类客户，如果需要在订单中区分订单来源，则可使用此字段） 天猫：tmall，拼多多：pinduoduo，京东 : jd 等平台类型编码
            15	remark	String(100)	否	备注
            16	isOneselfPickup	Number (1)	否	快件自取(默认0)，支持以下值：1：客户同意快件自取 0：客户不同意快件自
            17	isReturnSignBackRoutelabel	Number (1)	否	是否返回签回单路由标签：默认0，1：返回路由标签，0：不返回
            18	isReturnRoutelabel	Number (1)	否	是否返回路由标签：默认0，1：返回路由标签，0：不返回
            元素<请求>Order/List<ContactInfo> （必填）

            序号	参数列表	类型	是否必传	含义
            1	contactType	Number (1)	是	地址类型：1，寄件方信息2，到件方信息 3，委托人信息
            2	company	String(100)	条件	公司名称–与联系人必输一个
            3	contact	String(100)	条件	联系人–与公司必输一个
            4	tel	String(20)	条件	联系电话–与联系方手机必输一个
            5	mobile	String(20)	条件	联系方手机–与联系方手机必输一个
            6	zoneCode	String(30)	条件	城市代码或国家代码，如果是跨境件，则此字段为必填。
            7	country	String(30)	是	国家或地区 2位代码 参照附录国家代码附件–国内传CN
            8	province	String(30)	否	所在省级行政区名称，必须是标准的省级行政区名称如：北京、广东省、广西壮族自治区等；此字段影响原寄地代码识别，建议尽可能传该字段的值。
            9	city	String(100)	否	所在地级行政区名称，必须是标准的城市称谓 如：北京市、深圳市、大理白族自治州等；此字段影响原寄地代码识别，建议尽可能传该字段的值。
            10	county	String(30)	否	所在县/区级行政区名称，必须是标准的县/区称谓，如：福田区，南涧彝族自治县、准格尔旗等。
            11	address	String(200)	条件	详细地址，若province/city字段的值不传，此字段必须包含省市信息，避免影响原寄地代码识别，如：广东省深圳市福田区新洲十一街万基商务大厦10楼；若需要生成电子运单，则为必填。
            元素<请求>Order/List<CargoDetail> （必填）

            序号	参数列表	类型	是否必传	含义
            1	name	String(128)	是	货物名称，如果需要生成电子运单，则为必填。
            2	englishName	String(128)	否	货物英文名称
            3	count	Number(5)	否	货物数量 验货服务、跨境件报关需要填写
            4	unit	String(30)	否	货物单位，如：个、台、本，跨境件报关需要填写。
            5	weight	Number(16,3)	否	订单货物单位重量，包含子母件，单位千克，精确到小数点后3位跨境件报关需要填写。
            6	snCode	String(4000)	否	货物标识码，IN52增值服务optId为1,2,3时，需填写，多个时用逗号隔开。
            元素<请求>Order/List<Service> （下发增值服务可选填）

            序号	参数列表	类型	是否必传	含义
            1	name	String(20)	是	增值服务名，如COD等。
            2	value	String(30)	条件	增值服务扩展属性，参考增值服务传值说明。
            IN52对应样例: [{“name”:“IN52”,“value”:"[{“optId”:4,“value”:[{“additionSnCode”:“1235”,“additionSnCodeName”:“包装袋2”,“cargoSnCode”:“333333”}]}]"}]
            optId支持1,2,3,4不能为空，为1,2,3时可以不用传value ,对应基础验货、智能验货、组合验货、组合验货
            3	value1	String(30)	条件	增值服务扩展属性
            4	value2	String(30)	条件	增值服务扩展属性2
            5	value3	String(30)	条件	增值服务扩展属性3
            6	Value4	String(30)	条件	增值服务扩展属性4
            7	Value5	String(1000)	条件	增值服务扩展属性5 样例:
            IN67对应:
            { “wlCode”: “sku123345667”, “num”: “2”, “price”: “20.0”, “createTime”: “2019-04-15 18:11:39” }, { “wlCode”: “sku223345667”, “num”: “1”, “price”: “10.0”, “createTime”: “2019-04-15 18:11:39” }]}
            IN59对应:{“credentialNo”：“123456”}
            元素<请求>Order/List<ExtraInfo> （选填）

            序号	参数列表	类型	是否必传	含义
            1	attrName	String(256)	否	扩展字段 说明：attrName为字段定义，具体如下表，value存在attrVal
            2	attrVal	String(1024)	否	扩展字段值
            attrName	attrVal
            attr001~attr020	其中attr005　逆向订单时记录 订单类型 order_type 用来推送lscm “退货订单”与“维修订单”
            secondSysOrderNo	二程单号
            attachment	委托人的附件图片url地址
            agentNo	代理单号
            podModelAddress	签单返还地址
            paymentAmount	证照支付金额
            paymentStatus	证照支付状态
            otherFeeAmt	其他费用
            merchantPayOrderNo	商户支付订单号
            shopCode	门店编码
            inputerEmpCode	realnameNum
            realnameNum	寄件实名认证流水号
            exportCompName	进口商公司名称
            exportCompTel	进口商联系电话
            exportCompAddr	进口商地址
            wayOfClosing	成交方式
            exportDeclarationMethod	出口报关方式
            importDeclarationMethod	进口报关方式
            personalBaggage	个人行李
            vatNum	VAT号
            buyerFreight	买家运费
            buyerNick	买家昵称
            taxPayment	买家税款
            patTime	支付时间
            actPay	成交金额
            buyerPremium	买家保费
            discountAmount	优惠金额
            payName	支付企业在海关注册登记的企业名称
            paycodeCustoms	支付企业的海关注册登记编号
            promotionType	促销类型
            orderName	订购人
            signBackRemark	签回单备注信息
            customerRightsReq	权益请求信息(详见2.1.2.8) – 2021-1-29-新增
            platPayFee	平台支付金额 （说明:非负数字类型 单位:元）
            含固定抵扣金额–传抵扣值
            不含平台抵扣-传空
            selfSend	自寄件标记
            0 非自寄
            1 网点自寄
            2 丰巢柜自寄
            snCodeCheckType	对snCode进行验货 值为1：验收部分 0：验收所有 –
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "language":"zh_CN",
                "orderId":"F2_20200604180946",
                "customsInfo": {
                    "declaredValue":6000.9654
                },
                "cargoDetails":[
                    {
                        "amount":100.5111,
                        "count":2.365,
                        "currency":"HKD",
                        "goodPrepardNo":"AAAA002",
                        "hsCode":"AAAA004",
                        "name":"护肤品1",
                        "productRecordNo":"AAAA001",
                        "sourceArea":"CHN",
                        "taxNo":"AAAA003",
                        "unit":"个",
                        "weight":6.1
                    }],
                "cargoDesc":"苹果",
                "extraInfoList":[
                    {
                        "attrName":"hhtWaybill",
                        "attrVal":"0"
                    },
                    {
                        "attrName":"shopCode",
                        "attrVal":""
                    },
                    {
                        "attrName":"merchantPayOrderNo",
                        "attrVal":"184oe3725c7n3qi3jysa"
                    },
                    {
                        "attrName":"podModelAddress",
                        "attrVal":"EOS-FSS-CORE"
                    }],
                "serviceList":[
                    {
                        "name":"INSURE",
                        "value":"3000"
                    }],
                "contactInfoList": [
                    {
                        "address":"软件产业基地11栋",
                        "city":"深圳市",
                        "contact":"小曾",
                        "contactType":1,
                        "country":"CN",
                        "county":"南山区",
                        "mobile":"13480155048",
                        "postCode":"580058",
                        "province":"广东省",
                        "tel":"4006789888"
                    },
                    {
                        "address":"广东省广州市白云区湖北大厦",
                        "city":"",
                        "company":"顺丰速运",
                        "contact":"小邱",
                        "contactType":2,
                        "country":"CN",
                        "county":"",
                        "mobile":"13925211148",
                        "postCode":"580058",
                        "province":"",
                        "tel":"18688806057"
                    }],
                "monthlyCard":"",
                "payMethod":1,
                "expressTypeId":1,
                "parcelQty":4,
                "totalLength":12.0,
                "totalWidth":12.0,
                "totalHeight":10.0,
                "volume":8.0,
                "totalWeight":11.1,
                "totalNetWeight":"12.1",
                "sendStartTm":"2020-03-10 10:00:00",
                "isDocall":1,
                "isSignBack":1,
                "isUnifiedWaybillNo":0,
                "bizTemplateCode":"2020312_order",
                "specialDeliveryTypeCode":"1",
                "specialDeliveryValue":"身份证:后八位" 
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	orderId	String(64)	是	客户订单号
            2	originCode	String(10)	否	原寄地区域代码，可用于顺丰电子运单标签打印。
            3	destCode	String(10)	否	目的地区域代码，可用于顺丰电子运单标签打印。
            4	filterResult	Number(2)	否	筛单结果： 1：人工确认 2：可收派 3：不可以收派
            5	remark	String(100)	条件	如果filter_result=3时为必填，不可以收派的原因代码：1：收方超范围2：派方超范围3-：其它原因高峰管控提示信息【数字】：【高峰管控提示信息】(如 4：温馨提示 ，1：春运延时)
            6	url	String(200)	否	二维码URL（用于CX退货操作的URL）
            7	payment Link	String(200)	否	用于第三方支付运费的URL
            8	isUpstairs	String(1)	否	是否送货上楼 1:是
            9	isSpecialWarehouseService	String(4)	否	true 包含特殊仓库增值服务
            10	serviceList	List<Service>	否	下单补充的增值服务信息
            11	returnExtraInfoList	List<ExtraInfo>	否	返回信息扩展属性
            12	waybillNoInfoList	List<WaybillNoInfo>	否	顺丰运单号
            13	routeLabelInfo	List<RlsResultRespDto>	否	路由标签
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "apiResponseID": "000173271968963FA47C03E68000103F",
                "apiErrorMsg": "",
                "apiResultCode": "A1000",
                "apiResultData": "{\"success\":true,\"errorCode\":\"S0000\",\"errorMsg\":null,\"msgData\":{\"orderId\":\"5ed9696e-a81d-4a5b-968d-182c2d8c09e0\",\"originCode\":\"527\",\"destCode\":\"993\",\"filterResult\":2,\"remark\":\"\",\"url\":null,\"paymentLink\":null,\"isUpstairs\":null,\"isSpecialWarehouseService\":null,\"mappingMark\":null,\"agentMailno\":null,\"returnExtraInfoList\":null,\"waybillNoInfoList\":[{\"waybillType\":1,\"waybillNo\":\"SF7444400048449\"}],\"routeLabelInfo\":[{\"code\":\"1000\",\"routeLabelData\":{\"waybillNo\":\"SF7444400048449\",\"sourceTransferCode\":\"\",\"sourceCityCode\":\"527\",\"sourceDeptCode\":\"527\",\"sourceTeamCode\":\"\",\"destCityCode\":\"993\",\"destDeptCode\":\"993AB\",\"destDeptCodeMapping\":\"\",\"destTeamCode\":\"\",\"destTeamCodeMapping\":\"\",\"destTransferCode\":\"993VA\",\"destRouteLabel\":\"993VA-AB\",\"proName\":\"顺丰特惠\",\"cargoTypeCode\":\"T6\",\"limitTypeCode\":\"T6\",\"expressTypeCode\":\"B1\",\"codingMapping\":\"V1\",\"codingMappingOut\":\"\",\"xbFlag\":\"0\",\"printFlag\":\"000000000\",\"twoDimensionCode\":\"MMM={'k1':'993VA','k2':'993AB','k3':'','k4':'T6','k5':'SF7444400048449','k6':'','k7':'d45555f9'}\",\"proCode\":\"T6\",\"printIcon\":\"00000000\",\"abFlag\":\"\",\"destPortCode\":\"\",\"destCountry\":\"\",\"destPostCode\":\"\",\"goodsValueTotal\":\"\",\"currencySymbol\":\"\",\"cusBatch\":\"\",\"goodsNumber\":\"\",\"errMsg\":\"\",\"checkCode\":\"d45555f9\",\"proIcon\":\"\",\"fileIcon\":\"\",\"fbaIcon\":\"\",\"icsmIcon\":\"\",\"destGisDeptCode\":\"993AB\",\"newIcon\":null},\"message\":\"SF7444400048449:\"}],\"contactInfoList\":null}}"
            }
            失败响应:-范例1
            {
                "apiResponseID": "000173271968963FA47C03E68000103F",
                "apiErrorMsg": "",
                "apiResultCode": "A1000",
                "apiResultData": "{\"success\":"\false\",\"errorCode\":\"8016\",\"errorMsg\":\"重复下单\",\"msgData\":null}"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类	是否重试
            20001	重复请求	系统错误	是
            20046	截单营业时间获取失败	系统错误	是
            3005	生成运单号错误	系统错误	是
            8177	正值运力高峰期，普通会员（非会员）的寄件通道预约已满，敬请谅解	系统错误	否
            20019	筛单不可到	系统错误	否
            8216	寄件电话属于"防骚扰保护"电话，请通过顺丰官方渠道（微信公众号、顺丰速运APP、官网或95338客户电话下单）	系统错误	否
            8096	您的预约超出今日营业时间，无法上门收件。	系统错误	否
            其他类型	其他类型的描述	系统错误	否 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_CREATE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseCreateOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 订单地址筛选接口
        /// 电退-订单地址筛选接口
        /// 该接口用于:
        /// 客户通过传入地址信息，进行地址可达确认；
        /// 顺丰的地址库沿用国家统计局标准行政区划。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult FilterOrder(string partnerID, string checkword, MsgDataRequestFilterOrder data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            该接口用于:
            客户通过传入地址信息，进行地址可达确认；
            顺丰的地址库沿用国家统计局标准行政区划。

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码E	EXP_RECE_FILTER_ORDER
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	srcProvince	String(30)	条件	寄件方所在省份，必须是标准的省名称称谓 如：广东省，如果是直辖市，请直接传北京、上海等。
            2	srcCity	String(100)	条件	寄件方所属城市名称，必须是标准的城市称谓 如：深圳市。
            3	srcCounty	String(30)	条件	寄件方所在县/区，必须是标准的县/区称谓，示例：“福田区”。
            4	srcCountry	String(50)	条件	寄件方国家或地区代码如:CN(中国） 日本(JP) 886（台湾）852（香港）跨境件必传
            5	srcAddress	String(150)	是	寄件方详细地址
            6	custId	String(10)	否	月结账号
            7	destProvince	String(30)	条件	到件方所在省份，必须是标准的省名称称谓 如：广东省，如果是直辖市，请直接传北京、上海等。
            8	destCity	String(100)	条件	到件方所属城市名称，必须是标准的城市称谓 如：深圳市。
            9	destCounty	String(30)	条件	到件方所在县/区，必须是标准的县/区称谓，示例：“福田区”。
            10	destCountry	String(50)	条件	到件方国家或地区代码如:CN(中国） 日本(JP) 886（台湾）852（香港）跨境件必传
            11	destAddress	String(150)	是	到件方详细地址
            12	isDoCall	String(1)	是	是否通过手持终端通知顺丰收派员上门收件，支持以下值：1：要求 其它为不要求 电商退货校验需要传1
            13	isReverse	String(1)	否	是否为逆向单，退换货业务1，是 其他 否 电商退货不传此值
            14	oneself_pickup_flg	String(1)	否	快件自取，支持以下值：1为客户同意快件自取 其它为客户不同意快件自取
            15	addService	String(100)	否	增值服务代码，多个增值服务英文逗号分隔 具体增值服务代码请参照下单规范如：COD,TDELIVERY,NOTICE 电商退货不传此值
            16	need_return_tracking_no	String(1)	否	是否返回签回单（签单返还）的运单号，支持以下值：1：要求 其它为不要求 电商退货不传此值
            17	pay_method	String(1)	否	付款方式：1:寄方付 2:收方付 默认为1。 电商退货不传此值
            18	srcPostalcode	String(10)	条件	寄方邮编，跨境件必传
            19	destPostalcode	String(10)	条件	到方邮编，跨境件必传
            12	remark	String (1)	是	不可以收派的原因代码： 0 可收派 1 寄方超范围 2 超范围转寄(607) 3 收方超范围 4 收派地址都不可达 5 需人工确认 6 其它原因
            2.6. 请求示例\应用场景(JSON)示例
            1.若使用结构化地址，则省/市/区字段必输（推荐此方式），且明细地址内不再封装省市区信息
            2.若使用文本明细地址，则在明细地址内封装省市区信息，且不下发单独的省市区字段。

            请求报文:

            {
	            "destCountry" : "CN",
	            "srcProvince" : "广东省",
	            "destAddress" : "棕坪乡街上",
	            "destCity" : "遵义市",
	            "srcCity" : "河源市",
	            "srcCountry" : "CN",
	            "srcCounty" : "连平县",
	            "srcAddress" : "陂头镇",
	            "destCounty" : "道真仡佬族苗族自治县",
	            "destProvince" : "贵州省",
	            "custId" : "123456789"
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	filterResult	String (1)	是	筛单结果： 1 可达 2 不可达 3 无法确认 4 人工确认
            2	srcCityCode	String(10)	条件	原寄地区域代码，如果可收派，此项不能为空。
            3	srcProvince	String (30)		寄件方筛单标准化后的省
            4	srcCity	String (100）		寄件方筛单标准化后的城市
            5	srcCounty	String (30)		寄件方筛单标准化后的区/县
            6	destCityCode	String(10)	条件	目的地区域代码，如果可收派，此项不能为空。
            7	srcDetailAddr	String (1)		寄件地址是否详细：0-详细；1-不详细
            8	destDetailAddr	String (1)		到件地址是否详细：0-详细；1-不详细
            9	destProvince	String (30)		到件方筛单标准化后的省
            10	destCity	String (100）		到件方筛单标准化后的城市
            11	destCounty	String (30)		到件方筛单标准化后的区/县
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {  "apiErrorMsg": "",
               "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
               "apiResultCode": "A1000",
               "apiResultData": 
            "{
                "success": true,
                "errorCode": "S0000",
                "msgData": {
                    "destDetailAddr": "1",
                    "srcTown": "陂头镇",
                    "destTown": "棕坪乡",
                    "srcCity": "河源市",
                    "destCity": "遵义市",
                    "reqGisFlag": 0,
                    "remark": "0",
                    "srcDetailAddr": "1",
                    "destCityCode": "052",
                    "destProvince": "贵州省",
                    "srcProvince": "广东省",
                    "filterResult": "1",
                    "srcDetailType": "NO_MATCH_LEVEL",
                    "srcCounty": "连平县",
                    "srcCityCode": "762",
                    "destDetailType": "NO_MATCH_LEVEL",
                    "destCounty": "道真仡佬族苗族自治县"
                }
            }"
            }

            失败响应:-范例1
            请求异常（false）
            {
               "apiErrorMsg": "",
               "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
               "apiResultCode": "A1000",
               "apiResultData": 
            "{\"errorMessage\":\"请求失败，请重试\",\"success\":false,\"errorCode\":\"09020501\"}"
            }

            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            XXXXXXXX	XX参数错误	系统错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_FILTER_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseFilterOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 服务时间同步接口
        /// 电退-服务时间同步接口
        /// 该接口用于:
        /// 客户通过传入寄件方地址信息，查询寄件地址的可揽件服务时间；
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult QueryServiceTime(string partnerID, string checkword, MsgDataRequestQueryServiceTime data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            该接口用于:
            客户通过传入寄件方地址信息，查询寄件地址的可揽件服务时间；

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	EXP_RECE_QUERY_SERVICE_TIME
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_EPS_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	provName	String	是	寄件方所在省份，必须是标准的省名称称谓 如：广东省，如果是直辖市，请直接传北京、上海等。
            2	cityName	String	是	寄件方所属城市名称，必须是标准的城市称谓 如：深圳市。
            3	districtName	String	是	寄件方所在县/区，必须是标准的县/区称谓，示例：“福田区”。
            4	streetName	String	条件	寄件方所在街道，streetName和addrDetail不能同时为空，
            5	addrDetail	String	条件	寄件方详细地址，addrDetail不为空时，根据addrDetail查询；addrDetail为空时，根据streetName查询。当需要获取服务时间忙闲状态（busyFlag，参考4.2.3的msgData）时，详细地址必传；
            2.6. 请求示例\应用场景(JSON)示例
            若不下发明细地址，则按照行政区划层级查询服务时间。（提前查询，支持城市和乡镇/街道层级查询）–基于街道查询地址服务时间不代表明细地址可服务时间，使用此功能前请与业务方确认。
            若下发明细地址，则基于明细地址查询服务时间。（实时查询）

            请求报文:

            {
	            "provName" : "福建省",
	            "cityName" : "福州市",
	            "districtName" : "闽清县",
	            "streetName" : "云龙乡",
	            "addrDetail" : "灰寨镇镇中学校"	
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	serviceDate	String	是	示例：2021-04-25
            2	startTime	String	是	示例：2021-04-25 08:30:00
            3	endTime	String	是	示例：2021-04-25 21:00:00
            4	busyFlag	boolean	条件必填	示例：“busyFlag”: false
            1、支持客制化配置服务时间忙闲（busyFlag）字段，busyFlag，true，忙；false，闲；
            2、仅支持8~20点查服务时间忙闲；
            3、接口入参详细地址（addrDetail）必传；
            4、仅当服务时间涵盖当前的时间段，才会标记busyFlag（参考响应报文示例）；
            5、busyFlag仅表示当前服务时间忙闲状态；
            2.7. 返回示例\应用场景(JSON)示例
            三天内任一天不可服务，则当天的可服务时间为空。

            响应报文:

            成功响应:
            {
	            "success": true,
	            "errorCode": "",
	            "errorMsg": ""
	            "msgData": 
                    {
                        "busyFlag": false,
                        "serviceDate": "2021-12-08",
                        "startTime": "2021-12-08 08:00:00",
                        "endTime": "2021-12-08 21:00:00"
                    },
                    {
                        "serviceDate": "2021-12-09",
                        "startTime": "2021-12-09 08:00:00",
                        "endTime": "2021-12-09 21:00:00"
                    },
                    {
                        "serviceDate": "2021-12-10",
                        "startTime": "2021-12-10 08:00:00",
                        "endTime": "2021-12-10 21:00:00"
                    }
                ]
            }

            失败响应:-范例1
            请求异常（false）
            {
               "apiErrorMsg": "",
               "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
               "apiResultCode": "A1000",
               "apiResultData": 
            "{\"errorMessage\":\"请求失败，请重试\",\"success\":false,\"errorCode\":\"09020501\"}"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            XXXXXXXX	XX参数错误	系统错误            
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_QUERY_SERVICE_TIME";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseQueryServiceTime>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 订单状态查询接口
        /// 电退-订单状态查询接口
        /// 该接口用于:
        /// 此功能主要是根据单号查询订单状态
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult SearchOrderState(string partnerID, string checkword, MsgDataRequestSearchOrderState data, string accessToken = "", string environment = "sfapi")
        {
            /*   
            1. 功能描述
            该接口用于:
            此功能主要是根据单号查询订单状态

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	EXP_RECE_SEARCH_ORDERSTATE
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	searchType	number(1)	否	查询类型(默认1)： 1: 按订单号查询 (推荐)2：按运单号查询
            2	searchNo	String(100)	是	查询单号 当searchTyp=1 此值为订单号 当searchTyp=2 此值为运单号
            3	checkType	number(1)	否	校验类型(默认1) 1，电话号码后4位校验 2，月结卡号校验
            4	checkNo	String	是	校验值
            当checkType=1 此值为电话号码后4位
            当checkType=2 此值为月结卡号
            多个值逗号分隔（最多支持传2个）
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "searchType": 1,
	            "searchNo": "DATASYNC2021031916071300000249",
	            "checkType": 2,
	            "checkNo": "5125690150,5125690151"
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	orderNo	String(64)	是	客户订单号
            2	waybillNo	String(64)	否	顺丰运单号
            3	orderStateCode	String(20)	是	订单状态
            4	orderStateDesc	String(200)	是	订单状态描述
            5	empCode	String(100)	否	收件员工工号
            6	empPhone	String(100)	否	收件员手机号
            7	netCode	String(20)	否	网点
            8	lastTime	String	否	最晚上门时间（yyyy-MM-dd HH:mm:ss）
            9	bookTime	String	否	客户预约时间（yyyy-MM-dd HH:mm:ss）
            10	carrierCode	String(10)	是	承运商代码(SF)
            11	createTm	String	否	状态操作时间（yyyy-MM-dd HH:mm:ss）
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
	            "apiErrorMsg": "",
	            "apiResponseID": "00016E7E2AD1F43FE443509C108FE33F",
	            "apiResultCode": "A1000",
	            "apiResultData": {
		            "success": true,
		            "errorCode": "S0000",
		            "errorMsg": null,
		            "msgData": {
			            "orderState": [{
				            "orderNo": "3327640429660171",
				            "waybillNo": "SF1011854728998",
				            "orderStateCode": "04-40001",
				            "orderStateDesc": "调度成功/收派员信息",
				            "empCode": "800021",
				            "empPhone": "00000000000",
				            "netCode": "755A",
				            "lastTime": "2021-03-19 11:10:02",
				            "bookTime": null,
				            "carrierCode": "SF",
				            "createTm": "2021-03-19 10:10:02"
			            }, {
				            "orderNo": "3327640429660171",
				            "waybillNo": "SF1011854728998",
				            "orderStateCode": "04-40037",
				            "orderStateDesc": "下单已接收",
				            "empCode": "800021",
				            "empPhone": "00000000000",
				            "netCode": "755A",
				            "lastTime": null,
				            "bookTime": null,
				            "carrierCode": "SF",
				            "createTm": "2021-03-19 10:10:02"
			            }, {
				            "orderNo": "3327640429660171",
				            "waybillNo": "SF1011854728998",
				            "orderStateCode": "00-40065",
				            "orderStateDesc": "订单超时结束",
				            "empCode": "800021",
				            "empPhone": "00000000000",
				            "netCode": "755A",
				            "lastTime": null,
				            "bookTime": null,
				            "carrierCode": "SF",
				            "createTm": "2021-03-23 00:02:12"
			            }]
		            }
	            }
            }
            失败响应:-范例1
            {
	            "apiErrorMsg": "",
	            "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
	            "apiResultCode": "A1000",
	            "apiResultData": {
		            "success ": false,
		            "errorCode": "S0003",
		            "errorMsg": "check failed",
		            "msgData": null
	            }
            }
            失败响应:-范例2
            {
	            "apiErrorMsg": "",
	            "apiResponseID": "00016AD45F84743F9486F3154DC9A03F",
	            "apiResultCode": "A1000",
	            "apiResultData": {
		            "success ": false,
		            "errorCode": "8013",
		            "errorMsg": "未传入查询单号",
		            "msgData": null
	            }
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述
            04	调度失败/等待
            04-40001	调度成功+收派员信息
            04-40037	下单已接收
            04-40068	订单已支付
            04-40002-40021	电话号码异常（电话错误/空号/停机）
            04-40002-40022	无法进入客户处，且客户不愿出来
            04-40002-40004	暂未联系上客户（电话无人接听/无法接通/关机
            04-40002-40005	经客户同意，更改收派时间
            04-40002-40027	天气原因，延误收派件
            04-40002-40028	交通原因，延误收派件
            04-40002-40031	不符合收件要求，无法揽收
            04-40002-40014	客户取消寄件
            04-40002-40015	客户重复下单
            04-40002-40016	下错单需转单
            04-40002-40035	工作量过大，延误收派件
            04-40002-40036	重货需转单
            00-40045-1000	调度取消订单
            00-40045-40046	人工补审消单
            00-2000	客户已取消订单
            05-40003	已正常收件状态
            00-40065	订单超时结束
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_SEARCH_ORDERSTATE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseSearchOrderState>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 快件时效查询接口
        /// 电退-快件时效查询接口
        /// 该接口用于:
        /// 此功能主要是根据运单号查询预计派件时间
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult SearchPromitm(string partnerID, string checkword, MsgDataRequestSearchPromitm data, string accessToken = "", string environment = "sfapi")
        {
            /*   
            1. 功能描述
            该接口用于:
            此功能主要是根据运单号查询预计派件时间

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	EXP_RECE_SEARCH_PROMITM
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_EPS_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	searchNo	String(100)	是	顺丰运单号
            2	checkType	Number(1)	否	校验类型默认(1)
            1:电话号码校验
            2:月结卡号校验
            3	checkNos	List<String>	是	校验值
            当校验类型为1时传电话号码
            当校验类型为2时传月结卡号
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
	            "searchNo": "SF1000181136590",
	            "checkType": 2,
	            "checkNos": ["5125690150",
	            "18218723913"]
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	searchNo	String(100)	是	顺丰运单号
            2	promiseTm	String(30)	是	预计派件时间格式:
            YYYY-MM-DD HH24:mm:SS
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "success": true,
              "errorCode": "S0000",
              "errorMsg": null,
              "msgData": {
                "searchNo": "SF1000181136590",
                "promiseTm": "2019-10-25 12:00:00"
              }
            }
            失败响应:-范例1
            {
              "success": false,
              "errorCode": "S0003",
              "errorMsg": "check failed",
              "msgData": null
            }
            失败响应:-范例2
            {
              "success": false,
              "errorCode": "8013",
              "errorMsg": "未传入查询单号",
              "msgData": null
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            XXXXXXXX	XX参数错误	系统错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_SEARCH_PROMITM";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseSearchPromitm>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 路由查询接口
        /// 电退-路由查询接口
        /// 该接口用于:
        /// 客户可通过此接口查询顺丰运单路由，顺丰会在响应XML报文返回当时点要求的全部路由节点信息。
        /// 此路由查询接口支持两类查询方式：
        /// 1.根据顺丰运单号查询：查询请求中提供接入编码与运单号，验证接入编码与所有请求运单号的归属关系，系统只返回具有正确归属关系的运单路由信息。
        /// 2.根据客户订单号查询：查询请求中提供接入编码与订单号，验证接入编码与所有请求订单号的归属关系，对于归属关系正确的订单号，找到对应的运单号，然后返回订单对应运单号的路由信息。适用于通过下单的客户订单。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult SearchRoutes(string partnerID, string checkword, MsgDataRequestSearchRoutes data, string accessToken = "", string environment = "sfapi")
        {
            /*   
            1. 功能描述
            该接口用于:
            客户可通过此接口查询顺丰运单路由，顺丰会在响应XML报文返回当时点要求的全部路由节点信息。
            此路由查询接口支持两类查询方式：
            1.根据顺丰运单号查询：查询请求中提供接入编码与运单号，验证接入编码与所有请求运单号的归属关系，系统只返回具有正确归属关系的运单路由信息。
            2.根据客户订单号查询：查询请求中提供接入编码与订单号，验证接入编码与所有请求订单号的归属关系，对于归属关系正确的订单号，找到对应的运单号，然后返回订单对应运单号的路由信息。适用于通过下单的客户订单。

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	EXP_RECE_SEARCH_ROUTES
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	language	Number(1)	否	返回描述语语言
            0：中文 1：英文 2：繁体
            2	trackingType	Number(2)	否	查询号类别：
            1：根据顺丰运单号查询，trackingNumber将被当作顺丰运单号处理
            2：根据客户订单号查询， trackingNumber将被当作客户订单号处理
            3	trackingNumber	List<String>	是	查询号：
            1、如果trackingType=1，则此值为顺丰运单号
            2、如果trackingType=2，则此值为客户订单号
            4	methodType	Number(1)	否	路由查询类别：
            1：标准路由查询
            2：定制路由查询
            5	referenceNumber	String(4000)	否	参考编码（目前针对亚马逊客户，由客户传）
            6	checkPhoneNo	String(30)	否	电话号码验证
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
	            "language": "0",
	            "trackingType": "1",
	            "trackingNumber": ["444003077898", "441003077850"],
	            "methodType": "1"
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	routeResps	List	是	顺丰运单号对应的路由详情（列表）
            元素<响应> routeResps

            序号	参数列表	类型	是否必传	含义
            1	mailNo	String	是	顺丰运单号
            2	routes	List	是	路由信息（列表）
            元素<响应>routes

            序号	参数列表	类型	是否必传	含义
            1	acceptTime	Date	是	路由节点发生的时间，格式：YYYY-MM-DD HH24:MM:SS，示例：2012-7-30 09:30:00。
            2	acceptAddress	String(100)	否	路由节点发生的地点
            3	remark	String(150)	是	路由节点具体描述
            4	opcode	String(20)	是	路由节点操作码
            注意事项：
            同一批次顺丰运单路由信息必须为同一语言。
            目前支持中文简体，中文繁体和英文
            可从顺丰商务人员处获取顺丰标准路由节点信息列表。

            定制路由查询须与顺丰商务人员沟通，客户可基于顺丰所有路由节点（列表可从顺丰商务人员处获取）定制所需的路由节点及其具体描述与操作码。

            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "apiResponseID": "000173271968963FA47C03E68000103F",
                "apiErrorMsg": "",
                "apiResultCode": "A1000",
                "apiResultData": "{\"success\":true,\"errorCode\":\"S0000\",\"errorMsg\":null,\"msgData\":{\"routeResps\":[{\"mailNo\":\"SF1011603494291\",\"routes\":[{\"acceptTime\":\"2019-05-09 10:11:26\",\"acceptAddress\":\"深圳\",\"opcode\":\"50\",\"remark\":\"已派件\"},{\"acceptTime\":\"2019-05-09 18:11:26\",\"acceptAddress\":\"深圳\",\"opcode\":\"80\",\"remark\":\"已签收\"}]}]}}"
            }
            失败响应:-范例1
            {
                "succ": "fail"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            XXXXXXXX	XX参数错误	系统错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_SEARCH_ROUTES";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseSearchRoutes>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 订单确认/取消接口
        /// 电退-订单确认/取消接口
        /// 该接口用于:
        /// 1.客户在确定将货物交付给顺丰托运后，将运单上的一些重要信息，如快件重量通过此接口发送给顺丰。
        /// 2.客户在发货前取消订单。
        /// 3.修改地址仅支持修改收件地址，寄件地址需要变更请让用户取消后重新下单。
        /// 注意：订单取消之后，订单号也是不能重复利用的。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult UpdateOrder(string partnerID, string checkword, MsgDataRequestUpdateOrder1 data, string accessToken = "", string environment = "sfapi")
        {
            /*   
            1. 功能描述
            该接口用于:
            1.客户在确定将货物交付给顺丰托运后，将运单上的一些重要信息，如快件重量通过此接口发送给顺丰。
            2.客户在发货前取消订单。
            3.修改地址仅支持修改收件地址，寄件地址需要变更请让用户取消后重新下单。
            注意：订单取消之后，订单号也是不能重复利用的。

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	EXP_RECE_UPDATE_ORDER
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_EPS_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            元素<请求>OrderUpdate

            序号	参数列表	类型	是否必传	含义
            1	orderId	String(64)	是	客户订单号–客户侧唯一单号
            2	dealType	Number(1)	否	客户订单操作标识(默认1)： 1：确认 2：取消 3: 丰巢柜寄件取消
            3	waybillNoInfoList	List<waybillNoInfo>	否	顺丰运单号(如dealtype=1，必填)
            4	expressTypeId	Number (5)	否	快件产品类别，支持附录《快件产品类别表》的产品编码值，仅可使用与顺丰销售约定的快件产品。 禁止修改，固定电商退货产品代码236
            5	extraInfoList	List<ExtraInfo>	否	扩展属性
            6	serviceList	List<Service>	否	增值服务信息
            7	isConfirmNew	Number (1)	否	是否走新通用确认 1：支持修改寄件信息、收件人信息和预约时间 默认0
            8	destContactInfo	OrderContactInfoDto	否	收件人信息
            9	isDocall	Number(1)	否	是否通过手持终端通知顺丰收派员上门收件，支持以下值： 1：要求 其它为不要求
            10	sendStartTm	Date	否	预约时间(上门揽收时间)
            11	srcContactInfo	OrderContactInfoDto	否	寄件人信息(只支持修改地址信息)
            12	cargoDetails	List<CargoDetail>	是	拖寄物信息(见快递标准订单创建接口 CargoDetail )

            元素<请求>OrderUpdate/List<WaybillNoInfo>

            序号	参数列表	类型	是否必传	含义
            1	waybillType	Number (1)	否	运单号类型1：母单 2 :子单 3 : 签回单
            2	waybillNo	String(15)	否	运单号
            3	boxNo	String(64)	否	箱号
            4	length	Number (16,3)	否	长
            5	width	Number (16,3)	否	宽
            6	height	Number (16,2)	否	高
            7	volume	Number (16,2)	否	体积
            元素<请求>OrderUpdate/List<ExtraInfo>

            序号	参数列表	类型	是否必传	含义
            1	attrName	String(256)	否	扩展字段 说明：attrName为字段定义，具体如下表，value存在attrVal
            2	attrVal	String(1024)	否	扩展字段值
            扩展字段备注

            attrName	attrVal
            attr001	
            attr002	
            pickupAppointEndTime	（预约结束时间样例）2021-12-22 160:00:00
            元素<请求>OrderUpdate/List<Service>

            序号	参数列表	类型	是否必传	含义
            1	name	String(20)	是	增值服务名，如COD等。
            2	value	String(30)	条件	增值服务扩展属性，参考增值服务传值说明。
            3	value1	String(30)	条件	增值服务扩展属性
            4	value2	String(30)	条件	增值服务扩展属性2
            5	value3	String(30)	条件	增值服务扩展属性3
            6	Value4	String(30)	条件	增值服务扩展属性4
            元素<请求>OrderUpdate/OrderContactInfoDto

            序号	参数列表	类型	是否必传	含义
            1	company	String(100)	条件	公司名称
            2	contact	String(100)	条件	收方联系人
            3	tel	String(20)	条件	收方联系电话
            4	mobile	String(20)	否	收方手机
            5	country	String(30)	是	国家或地区 2位代码参照附录国家代码附件，中国为CN
            6	province	String(30)	否	所在省级行政区名称如：北京、广东省、广西壮族自治区等
            7	city	String(100)	否	所在地级行政区名称，必须是标准的城市称谓 如：北京市、深圳市、大理白族自治州等
            8	county	String(30)	否	所在县/区级行政区名称，必须是标准的县/区称谓，如：福田区
            9	address	String(200)	条件	详细地址，若province/city字段的值不传，此字段必须包含省市
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "dealType": 1,
                "orderId": "BZL51054473992769999",
                "totalHeight": 29.98,
                "totalLength": 29.98,
                "totalVolume": 26946.035992000005,
                "totalWeight": 2.09,
                "totalWidth": 29.98,
                "waybillNoInfoList": [
                    {
                        "waybillNo": "SF2000090670189",
                        "waybillType": 1
                    }
                ]
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	orderId	String(64)	是	客户订单号
            2	waybillNoInfoList	List<waybillNoInfo>	否	顺丰运单号
            3	resStatus	Number(1)	是	备注 1：客户订单号与顺丰运单不匹配 2 ：操作成功
            4	extraInfoList	List<ExtraInfo>	否	扩展属性
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "apiResponseID": "000173271983983FEDCAD1803FA64A3F",
                "apiErrorMsg": "",
                "apiResultCode": "A1000",
                "apiResultData": "{\"success\":true,\"errorCode\":\"S0000\",\"errorMsg\":null,\"msgData\":{\"orderId\":\"5ed9696e-a81d-4a5b-968d-182c2d8c09e0\",\"waybillNoInfoList\":[{\"waybillType\":1,\"waybillNo\":\"SF7444400048449\"}],\"resStatus\":2,\"extraInfoList\":null}}"
            }
            失败响应:-范例1
            {
                "apiResponseID": "000173271968963FA47C03E68000103F",
                "apiErrorMsg": "",
                "apiResultCode": "A1000",
                "apiResultData": "{\"success\":false,\"errorCode\":\"8024\",\"errorMsg\":\"未下单\",\"msgData\":null}"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            XXXXXXXX	XX参数错误	系统错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_UPDATE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseUpdateOrder1>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 清单费用推送接口 EXP_PUSH_WAYBILL_FEE
        /// 电退-清单费用推送接口
        /// 该接口用于:
        /// 清单费用收费信息推送给客户，推送相关字段信息：订单号、运单号、子单号、月结账号等新，只支持向bsp下单的，根据配置的属性推送。
        /// </summary>
        /// <param name="body">顺丰推送过来的数据</param>
        /// <param name="reqData">顺丰推送过来的数据转换后的实体</param>
        /// <returns></returns>
        public static SFResponseApiResultData PushWaybillsFee(string body, out MsgDataRequestPushWaybillsFee reqData)
        {
            /*
            1. 功能描述
            该接口用于:
            清单费用收费信息推送给客户，推送相关字段信息：订单号、运单号、子单号、月结账号等新，只支持向bsp下单的，根据配置的属性推送。

            2. 接口定义
            2.1. 接口服务代码
            名称	值
            接口服务代码	EXP_PUSH_WAYBILL_FEE
            接口类型	推送
            报文类型	application/x-www-form-urlencoded
            2.2. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	orderNo	String(100)	Y	客户下单时传入的订单号
            2	waybillNo	String(100)	Y	顺丰下单接口返回的15或12位运单号，母单号 如：SF10116351372291
            3	childNos	String(100)	N	多个用逗号隔开,子母件，当一票有多个包裹时，每个子件的运单号
            4	customerAcctCode	String(100)	N	10位数字，用来做账单结算的账号
            5	meterageWeightQty	String(100)	Y	包裹计费重量 单位kg
            6	realWeightQty	String(100)	N	实际重量
            7	productName	String(100)	Y	如顺丰特惠，顺丰标快
            8	quantity	String(100)	Y	托寄物包裹数量
            9	volume	String(100)	N	托寄物总体积
            10	feeList	List<FeeInfo>	N	费用信息
            feeList重要字段说明

            序号	参数列表	类型	是否必传	含义
            1	bizOwnerZoneCode	String(100)	Y	业务所属地区编码
            2	currencyCode	String(100)	Y	币别
            3	customerAcctCode	String(100)	Y	付款帐号
            4	feeAmt	String(100)	Y	金额
            5	feeAmtInd	String(100)	Y	个性化费用（如一些折扣或加价费用）
            6	feeIndType		Y	个性费用类型
            7	gatherEmpCode	String(100)	Y	交款人
            8	gatherZoneCode	String(100)	Y	收付款网点
            9	paymentChangeTypeCode	String(100)	Y	付款变更类型
            10	paymentTypeCode		Y	付款类型 1 寄付 2 到付 3 第三方付
            11	serviceId		Y	运单服务标记，可忽略
            12	settlementTypeCode	String(100)	Y	结算类型 1 现结 2 月结
            13	versionNo		Y	版本号 当红冲后版本号会增加
            14	waybillId		Y	运单关联标记 可忽略
            15	waybillNo		Y	运单母单号，
            16	feeTypeCode	String(100)	Y	费用类型 1 主运费 2 其他费用 3 保费 4 代收货款服务费 5 代收货款 (feeTypeCode可能传值如下：主运费：①type1 增值服务费：②超额现结费 type134 ③保费 type3④包装 type67 )
            2.4. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "waybillFee":[
                    {
                        "waybillNo":"444069129271",
                        "customerAcctCode":"9999999999",
                        "childNos":"002803693071,002803693099,002803693080",
                        "orderNo":"1dc300ee-d5bb-465f-86ed-f3f82a326153",
                        "meterageWeightQty":12.5,
                        "realWeightQty":12.5,
                        "volume":0,
                        "quantity":4,
                        "feeList":[
                            {
                                "bizOwnerZoneCode":"755A",
                                "currencyCode":"CNY",
                                "customerAcctCode":"9999999999",
                                "feeAmt":1,
                                "feeAmtInd":1,
                                "feeIndType":0,
                                "feeTypeCode":"3",
                                "gatherEmpCode":"000212",
                                "gatherZoneCode":"755A",
                                "paymentChangeTypeCode":"0",
                                "paymentTypeCode":"1",
                                "serviceId":-1,
                                "settlementTypeCode":"2",
                                "versionNo":0,
                                "waybillId":-1,
                                "waybillNo":"444069129271"
                            },
                            {
                                "bizOwnerZoneCode":"755A",
                                "currencyCode":"CNY",
                                "customerAcctCode":"9999999999",
                                "feeAmt":13.2,
                                "feeAmtInd":13.2,
                                "feeIndType":0,
                                "feeTypeCode":"1",
                                "gatherEmpCode":"000212",
                                "gatherZoneCode":"755A",
                                "inputTm": qq,
                                "paymentChangeTypeCode":"0",
                                "paymentTypeCode":"1",
                                "settlementTypeCode":"2",
                                "versionNo":0,
                                "waybillId":-1,
                                "waybillNo":"444069129271"
                            }
                        ],
                        "productName":"标准快递"
                    }
                ]
            }
            2.3. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	boolean	是	true成功 false失败
            2	retryFlag	boolean	否	true代表可以重试，false不需要重试
            3	errorCode	String(64)	否	500-系统错误
            4	errorMsg	String(300)	否	失败原因描述
            2.5. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
	            success:true
            }
            失败响应:-范例1
            {
                "success": false,
                "errorMsg": "失败原因描述",
                "errorCode": "500-系统错误"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述	分类
            XXXXXXXX	XX参数错误	系统错误
            */

            bool success = false;
            string errorCode = "500";
            string errorMsg = "系统错误";

            if (!string.IsNullOrEmpty(body))
            {
                var request = JsonHelper.DeserializeObject<PushWaybillsFeeRequest>(body);
                if (request != null)
                {
                    reqData = JsonHelper.DeserializeObject<MsgDataRequestPushWaybillsFee>(request.msgData);
                    success = true;
                    errorCode = "";
                    errorMsg = "";
                }
                else
                {
                    reqData = null;
                }
            }
            else
            {
                reqData = null;
            }
            return new SFResponseApiResultData()
            {
                apiResponseID = Guid.NewGuid().ToString(),//获取uuid
                apiErrorMsg = "",
                apiResultCode = "A1000",
                apiResultData = JsonHelper.SerializeObject(new ResponsePushWaybillsFee()
                {
                    success = success,
                    errorCode = errorCode,
                    errorMsg = errorMsg
                })
            };
        }

        /// <summary>
        /// 路由推送接口 EXP_PUSH_ROUTE
        /// 电退-清单费用推送接口
        /// 该接口用于:
        /// 该接口用于当路由信息生产后向客户主动推送要求的顺丰运单路由信息。推送方式为增量推送，对于同一个顺丰运单的同一个路由节点，不重复推送。
        /// 客户需提供一个符合以下规范的HTTP URL，以接收BSP推送的信息。
        /// </summary>
        /// <param name="body">顺丰推送过来的数据</param>
        /// <param name="reqData">顺丰推送过来的数据转换后的实体</param>
        /// <returns></returns>
        public static SFResponseApiResultData PushRoute(string body, out MsgDataRequestPushRoute reqData)
        {
            /*
            1. 功能描述
            该接口用于:
            该接口用于当路由信息生产后向客户主动推送要求的顺丰运单路由信息。推送方式为增量推送，对于同一个顺丰运单的同一个路由节点，不重复推送。
            客户需提供一个符合以下规范的HTTP URL，以接收BSP推送的信息。
            1.请求方法为：“application/x-www-form-urlencoded; charset=UTF-8”。
            Key:content
            2.信息以URL编码（字符集为UTF-8）的XML格式，通过HTTP POST方式推送给客户。
            3.客户在接收到信息后，需要先对其进行URL解码，得到相应的XML。
            4.在客户处理XML信息后，向BSP返回响应XML报文，响应XML报文结果只能为OK/ERR（参见XML报文说明），BSP将重新推送此次交易的所有信息。
            注意事项：
            1.需要与顺丰商务人员沟通确认路由信息的语言，目前支持中文简体，中文繁体和英文。
            2.需要与顺丰商务人员沟通确认推送的方式：
            3.标准路由推送，可从顺丰商务人员处获取顺丰标准推送路由节点信息列表。
            4.定制路由推送，须与顺丰商务人员沟通，客户可基于顺丰所有路由节点（列表可从顺丰商务人员处获取）定制所需的路由节点及其具体描述与操作码。

            2. 接口定义
            2.1. 接口服务代码
            名称	值
            接口服务代码	EXP_PUSH_ROUTE
            接口类型	推送
            报文类型	application/x-www-form-urlencoded
            2.1. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	id	Number(15)	是	不同的路由节点信息
            2	waybillNo	String(20)	是	顺丰运单号
            3	orderNo	String(64)	是	客户订单号
            4	acceptTime	Date	是	路由节点产生时间 YYYY-MM-DD HH24:MM:SS 示例：2012-7-30 09:30:00
            5	acceptAddress	String(100)	否	路由节点发生的城市
            6	remark	String(300)	否	路由节点具体描述
            7	opCode	String(20)	是	路由节点操作码
            8	reasonName	String	否	异常描述
            9	reasonCode	String	否	异常编码
            10	zoneCode	String(30)	否	网点代码
            11	province	String(30)	否	省（中文）
            12	city	String(30)	否	市（中文）
            13	district	String(30)	否	区（中文）
            14	courierName	String(15)	否	小哥名称
            15	courierPhone	String(15)	否	小哥电话
            16	deliveryDate	Date	否	预计派送时间 YYYY-MM-DD HH24:MM:SS 示例：2012-7-30 09:30:00
            17	extendAttach3	String(20)	否	opcode:648转单推送新的运单号
            2.3. 请求示例\应用场景(JSON)示例
            请求报文:

            {
	            "waybillRoute": [{
		            "waybillNo": "SF7444400031887",
		            "acceptAddress": "test",
		            "reasonName": "",
		            "orderNo": "202003225d33322239ddW1df5t3",
		            "acceptTime": "2020-05-11 16:56:54",
		            "remark": "test",
		            "opCode": "50",
		            "id": "158918741444476",
		            "reasonCode": ""
	            }, {
		            "waybillNo": "SF7444400031887",
		            "acceptAddress": "test",
		            "reasonName": "",
		            "orderNo": "202003225d33322239ddW1df5t3",
		            "acceptTime": "2020-05-11 16:56:54",
		            "remark": "test",
		            "opCode": "80",
		            "id": "158918741457126",
		            "reasonCode": ""
	            }]
            }
            2.2. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	boolean	是	true成功 false失败
            2	retryFlag	boolean	否	true代表可以重试，false不需要重试
            3	errorCode	String(64)	否	500-系统错误
            4	errorMsg	String(300)	否	失败原因描述
            2.4. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "success": true,
              "retryFlag": false,
              "errorCode": null,
              "errorMsg": null
            }
            失败响应:
            {
              "success": true,
              "retryFlag": false,
              "errorCode": 1000,
              "errorMsg": "系统异常"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码 errorCode	描述 errorMsg	分类
            S0000	成功	是
            S0001	非法的JSON格式	系统错误
            S0002	必填参数为空	系统错误
            S0003	系统发生数据错误或运行时异常	系统错误
            */

            bool success = false;
            string errorCode = "500";
            string errorMsg = "系统错误";

            if (!string.IsNullOrEmpty(body))
            {
                var request = JsonHelper.DeserializeObject<PushRouteRequest>(body);
                if (request != null)
                {
                    reqData = JsonHelper.DeserializeObject<MsgDataRequestPushRoute>(request.msgData);
                    success = true;
                    errorCode = "";
                    errorMsg = "";
                }
                else
                {
                    reqData = null;
                }
            }
            else
            {
                reqData = null;
            }
            return new SFResponseApiResultData()
            {
                apiResponseID = Guid.NewGuid().ToString(),//获取uuid
                apiErrorMsg = "",
                apiResultCode = "A1000",
                apiResultData = JsonHelper.SerializeObject(new ResponsePushRoute()
                {
                    success = success,
                    errorCode = errorCode,
                    errorMsg = errorMsg
                })
            };
        }

        /// <summary>
        /// 取件码推送接口 EXP_PUSH_PICK_CODE_VERIFY
        /// 电退-取件码校验接口
        /// 该接口用于:
        /// 用于取件员在上门取件时，根据C端客户提供的取件码，向电商平台发起核验请求。
        /// </summary>
        /// <param name="body">顺丰推送过来的数据</param>
        /// <param name="reqData">顺丰推送过来的数据转换后的实体</param>
        /// <returns></returns>
        public static SFResponseApiResultData PushPickCodeVerify(string body, out MsgDataRequestPushPickCodeVerify reqData)
        {
            /*
            1. 功能描述
            该接口用于:
            用于取件员在上门取件时，根据C端客户提供的取件码，向电商平台发起核验请求。

            2. 接口定义
            2.1. 接口服务代码
            名称	值
            接口服务代码	EXP_PUSH_PICK_CODE_VERIFY
            接口类型	推送
            报文类型	application/x-www-form-urlencoded
            2.2. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	orderId	String(64)	是	订单号
            2	waybillNo	String(64)	否	顺丰运单号
            3	pickCode	String(32)	是	取件码
            4	verifyTime	String(32)	否	核销时间
            2.4. 请求示例\应用场景(JSON)示例
            请求报文:

            {   
	            "orderId": "1611233544224",
	            "waybillNo": "SF1222222222222",
	            "pickCode": "699852",
	            "verifyTime": "2021-01-22 19:00:00"
            }
            2.3. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	boolean	是	true成功 false失败
            2	retryFlag	boolean	否	true代表可以重试，false不需要重试
            3	errorCode	String(64)	否	10-取件码错误，11-当前状态不支持核销取件码, 500-系统错误
            4	errorMsg	String(300)	否	失败原因描述
            2.5. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
	            "success":true
            }
            失败响应:-范例1
            { 
	            "success": false,
	            "retryFlag": true,
	            "errorCode": "500",
	            "errorMsg": "系统错误"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码 errorCode	描述 errorMsg	分类
            S0000	成功	是
            S0001	非法的JSON格式	系统错误
            S0002	必填参数为空	系统错误
            S0003	系统发生数据错误或运行时异常	系统错误
            */

            bool success = false;
            string errorCode = "500";
            string errorMsg = "系统错误";

            if (!string.IsNullOrEmpty(body))
            {
                var request = JsonHelper.DeserializeObject<PushPickCodeVerifyRequest>(body);
                if (request != null)
                {
                    reqData = JsonHelper.DeserializeObject<MsgDataRequestPushPickCodeVerify>(request.msgData);
                    success = true;
                    errorCode = "";
                    errorMsg = "";
                }
                else
                {
                    reqData = null;
                }
            }
            else
            {
                reqData = null;
            }
            return new SFResponseApiResultData()
            {
                apiResponseID = Guid.NewGuid().ToString(),//获取uuid
                apiErrorMsg = "",
                apiResultCode = "A1000",
                apiResultData = JsonHelper.SerializeObject(new ResponsePushPickCodeVerify()
                {
                    success = success,
                    errorCode = errorCode,
                    errorMsg = errorMsg
                })
            };
        }

        /// <summary>
        /// 订单状态推送接口 EXP_PUSH_ORDER_STATE
        /// 该接口用于:
        /// 此接口用于订单状态推送，将订单状态的各类信息推送给对接的客户
        /// </summary>
        /// <param name="body">顺丰推送过来的数据</param>
        /// <param name="reqData">顺丰推送过来的数据转换后的实体</param>
        /// <returns></returns>
        public static SFResponseApiResultData PushOrderState(string body, out MsgDataRequestPushOrderState reqData)
        {
            /*
            1. 功能描述
            该接口用于:
            此接口用于订单状态推送，将订单状态的各类信息推送给对接的客户

            2. 接口定义
            2.1. 接口服务代码
            名称	值
            接口服务代码	EXP_PUSH_ORDER_STATE
            接口类型	推送
            报文类型	application/x-www-form-urlencoded
            2.2. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	orderNo	String(64)	是	客户订单号
            2	waybillNo	String(64)	否	顺丰运单号
            3	orderStateCode	String(64)	是	订单状态
            4	orderStateDesc	String(200)	否	订单状态描述
            5	empCode	String(35)	否	收件员工工号
            6	empPhone	String(25)	否	收件员手机号
            7	empName	String(35)	否	收件人姓名
            8	netCode	String(20)	否	网点
            9	lastTime	date	否	最晚上门时间
            10	bookTime	date	否	客户预约时间
            11	carrierCode	String(10)	是	承运商代码(SF)
            12	createTm	date	否	状态操作时间
            2.4. 请求示例\应用场景(JSON)示例
            请求报文:

            {
	            "orderState": [{
		            "orderNo": "1111",
		            "waybillNo": "SFXXX",
		            "orderStateCode": "1",
		            "orderStateDesc": "XX",
		            "empCode": "XX",
		            "empPhone": "13988888888",
		            "netCode": "123",
		            "lastTime": "2020-11-11 10:19:19",
		            "bookTime": "2020-11-11 10:19:19",
		            "carrierCode": "1",
		            "createTm": "2020-11-11 10:19:19"
	            }]
            }
            2.3. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	boolean	是	true成功 false失败
            2	retryFlag	boolean	否	true代表可以重试，false不需要重试
            3	errorCode	String(64)	否	500-系统错误
            4	errorMsg	String(300)	否	失败原因描述
            2.5. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "success": true,
              "retryFlag": false,
              "errorCode": null,
              "errorMsg": null
            }
            失败响应:-范例1
            {
              "success": true,
              "retryFlag": false,
              "errorCode": 1000,
              "errorMsg": "系统异常"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            3.2 业务异常代码
            原因代码	描述
            04	调度失败/等待
            04-40001	调度成功+收派员信息
            04-40037	下单已接收
            04-40068	订单已支付
            04-40002-40021	电话号码异常（电话错误/空号/停机）
            04-40002-40022	无法进入客户处，且客户不愿出来
            04-40002-40004	暂未联系上客户（电话无人接听/无法接通/关机
            04-40002-40005	经客户同意，更改收派时间
            04-40002-40027	天气原因，延误收派件
            04-40002-40028	交通原因，延误收派件
            04-40002-40031	不符合收件要求，无法揽收
            04-40002-40014	客户取消寄件
            04-40002-40015	客户重复下单
            04-40002-40016	下错单需转单
            04-40002-40035	工作量过大，延误收派件
            04-40002-40036	重货需转单
            00-40045-1000	调度取消订单
            00-40045-40046	人工补审消单
            00-2000	客户已取消订单
            05-40003	已正常收件状态
            00-40065	订单超时结束
            04-40002-40014	客户取消寄件
            00-40045-10000	调度取消订单
            04-40002-40015	客户重复下单
            04-40002-40031	不符合收件要求，无法揽收
            00-40065	订单超时结束（标记滞留原因编码后72小时无其他状态更新，则在72小时后的下一个工作日凌晨推送订单超时结束状态）
            04-40068	订单已支付该状态表示小哥在提交打印面单后，寄件人通过线上支付（微信/支付宝/银联等）完成后，支付中心推送已支付至外部客户
            */

            bool success = false;
            string errorCode = "500";
            string errorMsg = "系统错误";

            if (!string.IsNullOrEmpty(body))
            {
                var request = JsonHelper.DeserializeObject<PushOrderStateRequest>(body);
                if (request != null)
                {
                    reqData = JsonHelper.DeserializeObject<MsgDataRequestPushOrderState>(request.msgData);
                    success = true;
                    errorCode = "";
                    errorMsg = "";
                }
                else
                {
                    reqData = null;
                }
            }
            else
            {
                reqData = null;
            }
            return new SFResponseApiResultData()
            {
                apiResponseID = Guid.NewGuid().ToString(),//获取uuid
                apiErrorMsg = "",
                apiResultCode = "A1000",
                apiResultData = JsonHelper.SerializeObject(new ResponsePushPickCodeVerify()
                {
                    success = success,
                    errorCode = errorCode,
                    errorMsg = errorMsg
                })
            };
        }

        /// <summary>
        /// 清单费用查询接口
        /// 该接口用于:
        /// 此功能主要是根据订单号或者运单号查询清单运费
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult QuerySFWaybill(string partnerID, string checkword, MsgDataRequestQuerySFWaybill data, string accessToken = "", string environment = "sfapi")
        {
            /*   
            1. 功能描述
            该接口用于:
            此功能主要是根据订单号或者运单号查询清单运费

            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	EXP_RECE_QUERY_SFWAYBILL
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	trackingType	String(1)	是	1:表示按订单查询
            2:表示按运单查询
            2	trackingNum	String(30)	是	订单号或运单号
            3	bizTemplateCode	String(64)	否	业务配置代码，针对客户业务需求配置的一套接口处理逻辑，一个接入编码可对应多个业务配置代码
            4	phone	String(30)	条件	配置校验手机号时必传，支持最高6个收寄方电话后4位下发， 每个电话号码使用英文逗号分隔
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "trackingType":"1",
                "trackingNum":"LFCN0007556700"
            }
            2.4. 公共响应参数
            序号	属性列表	类型	是否必传	含义
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	否	业务处理详细结果
            2.5. 响应参数<apiResultData>
            序号	参数列表	类型	是否必传	含义
            1	success	String	是	true 请求成功，false 请求失败
            2	errorCode	String	是	错误编码，S0000成功
            3	errorMsg	String	是	错误描述
            4	msgData	String	是	返回的路由详细数据
            一级子属性：waybillInfo详情

            序号	参数列表	类型	是否必传	含义
            1	waybillNo	String(30)	是	运单号
            2	orderId	String(64)	否	客户订单号
            3	waybillChilds	String	否	子单号,英文逗号分隔
            4	customerAcctCode	String(64)	否	月结帐号
            5	meterageWeightQty	NUMBER(10,3)	是	计费重量
            6	realWeightQty	NUMBER(10,3)	是	实际重量
            7	consigneeEmpCode	String(30)	否	收件员工号
            8	deliverEmpCode	String(30)	否	派件员工号
            9	cargoTypeCode	String(30)	否	快件内容
            10	cargoTypeName	String(30)	否	快件内容名称
            11	limitTypeCode	String(30)	否	时效类型
            12	limitName	String(30)	否	时效类型名称
            13	expressTypeCode	String(30)	否	业务类型
            14	expressTypeName	String(30)	否	业务类型名称
            15	consValue	String(30)	否	声明价值
            16	consValueCurrencyCode	String(30)	否	声明价值币种
            17	productCode	String(30)	否	产品代码
            18	prodName	String(30)	否	产品名称
            19	sourceProvince	String(30)	否	寄件省份
            20	sourceCity	String(30)	否	寄件城市
            21	consignorAddr	String(30)	否	寄件详细地址
            22	consignorContName	String(30)	否	寄件联系人
            23	consignorPhone	String(30)	否	寄件电话号码
            24	consignorMobile	String(30)	否	寄件手机号
            25	addresseeProvince	String(30)	否	收件省份
            26	addresseeCity	String(30)	否	收件城市
            27	addresseeAddr	String(30)	否	收件详细地址
            28	addresseeContName	String(30)	否	收件联系人
            29	addresseePhone	String(30)	否	收件电话号码
            30	addresseeMobile	String(30)	否	收件手机号
            一级子属性：waybillFeeList详情

            序号	参数列表	类型	是否必传	含义
            1	type	String(3)	是	费用类型
            2	name	String(30)	是	费用名称
            3	value	NUMBER(10,3)	是	费用金额
            4	paymentTypeCode	String(1)	否	付款类型：1.寄付。2.到付。3.第三方付
            5	settlementTypeCode	String(1)	否	结算类型：1为现结。2为月结
            6	serviceProdCode	String(30)	否	增值服务代码
            7	insuredValue	NUMBER(10,3)	否	保价金额
            8	customerAcctCode	String(30)	否	月结账号
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "apiResponseID": "0001732719DD763FEABEEBA244A5B23F",
                "apiErrorMsg": "",
                "apiResultCode": "A1000",
                "apiResultData": "{\"errorCode\":\"S0000\",\"msgData\":{\"waybillFeeList\":[{\"customerAcctCode\":\"9999999999\",\"name\":\"保费\",\"paymentTypeCode\":\"1\",\"settlementTypeCode\":\"2\",\"type\":\"1\",\"value\":205.0},{\"customerAcctCode\":\"9999999999\",\"paymentTypeCode\":\"2\",\"settlementTypeCode\":\"2\",\"type\":\"3\",\"value\":2.0}],\"waybillInfo\":{\"addresseeAddr\":\"北京市-市辖区-朝阳区-十里河文化园a座9楼\",\"addresseeContName\":\"好先生\",\"addresseeMobile\":\"13976655900\",\"billHigh\":0.0,\"billLong\":0.0,\"billWidth\":0.0,\"cargoTypeCode\":\"SP636\",\"consignorAddr\":\"广东省深圳市福田上沙东村0号\",\"consignorContName\":\"潘俊儒\",\"consignorMobile\":\"17688939300\",\"consignorPhone\":\"17688939300\",\"customerAcctCode\":\"9999999999\",\"destZoneCode\":\"755\",\"expressTypeCode\":\"B2\",\"limitTypeCode\":\"T6\",\"meterageWeightQty\":1.0,\"shieldFlg\":\"0\",\"sourceZoneCode\":\"755A\",\"volume\":35000.0,\"waybillNo\":\"SF7444400035470\"}},\"success\":true}"
            }


            失败响应:-范例1
            {
                "apiResponseID": "000173271968963FA47C03E68000103F",
                "apiErrorMsg": "",
                "apiResultCode": "A1000",
                "apiResultData": "{\"errorMessage\":\"非法的JSON格式\",\"success\":false,\"errorCode\":\" S0001\"}"
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明	解决方法
            A1000	统一接入平台校验成功，调用后端服务成功;
            注意：
            不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果	表示接口调用正常
            A1001	必传参数不可为空	请做以下几点检查：
            1、参数列表必传字段未填写
            2、请求报文头，未配置Content-type：application/x-www-form-urlencoded
            3、参数key存在空格问题
            4、http请求参数都通过http URL编码传送
            5、业务数据报文（msgData）为json报文数据格式
            6、接口整体报文为form表单
            A1002	请求时效已过期	使用OAuth2认证会产生该提示
            请检查业务接口的accessToken参数是否超过2小时，2小时口令会更新，请调用OAuth2认证接口重新获取
            A1003	IP无效	顾客编码（partnerID）配置了需校验IP，请解除校验或按绑定IP调用接口
            A1004	无对应服务权限	可能存在的原因：
            1、顾客编码（partnerID）没有配置（关联）对应接口的业务接口，请在【开发者对接】-【API列表】中关联；
            2、接口请求数据与实际环境不一致，请先查看【开发者对接】-【API列表】接口状态：
            a、【测试中】请使用沙箱环境
            b、【已上线】请使用正式环境；
            3、后台配置没有生效，可等待2分钟后在试试，如果还是无法操作，请报障人工处理
            A1005	流量受控	丰桥为接口功能联调环境，接口整体都有限流管控，单客户编码对应的每个接口限流规则：
            1、单接口调用30次/s 2、单接口调用3000次/天
            请尽量只操作功能联调，切勿进行接口压测，谢谢！
            A1006	数字签名无效	请做以下几点检查：
            1、确认checkword是否配置正确
            2、确认verifyCode、msgDigest是否加密加签正确
            3、确认参数是否有特殊字符，如：&
            4、参数整体式form表单格式
            5、非java类语言，需注意特殊字符，目前支持的特殊字符“*”，“空格”，“-”请优先使用
            6、如果数字签名操作不便，可改为OAuth2认证，Token交互即可，具体参见【开发规范】【鉴权方式说明】
            A1007	重复请求	接口层暂未启用，业务层主要是针对下单接口，客户请求参数msgData中的orderId请不要重复使用，修改后在调用接口
            A1008	数据解密失败	在特殊场景中使用，如有出现请报障人工处理
            A1009	目标服务异常或不可达	接口下游服务异常，如有出现请报障人工处理
            A1010	状态为沙箱测试	该问题在老客户中会有此类问题，新客户不会出现，如有出现请报障人工处理
            A1099	系统异常	接口服务异常，如有出现请报障人工处理
            3.2 业务异常代码
            原因代码	描述	分类
            S0000	成功	
            S0001	非法的JSON格式	系统错误
            S0002	必填参数为空	系统错误
            S0003	系统发生数据错误或运行时异常	系统错误
            B0001	Ak校验不通过	业务错误
            B0002	收派员数据不存在	业务错误
            B0003	收派员姓名不一致	业务错误
            B0004	收派员手机号不一致	业务错误
            B0005	收派员身份证不一致	业务错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "EXP_RECE_QUERY_SFWAYBILL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseQuerySFWaybill>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 电商退货服务类接口

        #region 微派服务类接口

        /// <summary>
        /// 预生成资源id接口
        /// 用于下单电子回单增值服务（IN149-3）前，预生成下单参数资源id
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="accessToken"></param>
        /// <param name="environment">调用环境，sfapi：生产环境；ssfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WpGetPreResourceId(string partnerID, string checkword, string accessToken = "", string environment = "sfapi")
        {
            /*	
            1. 功能描述
            用于下单电子回单增值服务（IN149-3）前，预生成下单参数资源id

            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WP_GET_PRE_RESOURCE_ID
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WP_GET_PRE_RESOURCE_ID）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	expiresIn	Number	条件	accessToken,使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>  ： 空
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	object	否		业务数据报文
            2.4.1 响应参数<apiResultData>
            #	属性名	类型(约束)	必填	描述
            1	code	String	是	0:成功;其他:失败
            2	message	String	否	失败信息
            3	requestId	String	是	请求标识
            4	data	object	是	业务数据报文
            2.4. 2响应参数<data>
            #	属性名	类型(约束)	必填	描述
            1	preResourceId	String	是	预生成资源id
            2.5. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
	            "code": 0,
	            "data": {
		            "preResourceId": "FILPRE79c3be3864b8406e9ad7ed2b48570448"
	            },
	            "message": "成功",
	            "requestId": "41844cfcae63422"
            }
            失败报文-范例1
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "826221e7a7dd492"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WP_GET_PRE_RESOURCE_ID";
            string msgData = "";
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;


            var result = HttpHelper.GetResponseSgspdcsString(content, null, environment);
            if (!string.IsNullOrEmpty(result))
            {
                var response = JsonHelper.DeserializeObject<ResponseWpGetPreResourceId>(result);
                errmsg = response.apiErrorMsg;
                if (response.apiResultCode == "A1000")
                {
                    var apiResultData = response.apiResultData;
                    errmsg = apiResultData.message;
                    if (apiResultData.code == 0)
                    {
                        errcode = "0";
                        resultdata = JsonHelper.SerializeObject(apiResultData.data);
                    }
                    else
                    {
                        errcode = apiResultData.code.ToString();
                    }
                }
                else
                {
                    errcode = response.apiResultCode;
                    errmsg = response.apiErrorMsg;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #region 获取待签署文件上传地址

        /*
        分两步：一、 获取待签署文件上传地址；二、根据临时地址上传文件
        */

        /// <summary>
        /// 获取待签署文件上传地址
        /// 用于下单电子回单增值服务（IN149-3）时，获取文件上传地址，开发者可以通过此Url把待签署文件上传到微签服务端。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="accessToken"></param>
        /// <param name="environment">调用环境，sfapi：生产环境；ssfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WpGetPreUploadUrl(string partnerID, string checkword, string accessToken = "", string environment = "sfapi")
        {
            /*	
            1. 功能描述
            用于下单电子回单增值服务（IN149-3）时，获取文件上传地址，开发者可以通过此Url把待签署文件上传到微签服务端。

            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WP_GET_UPLOAD_URL
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WP_GET_UPLOAD_URL）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>  ： 空
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	object	否		业务数据报文
            2.4.1 响应参数<apiResultData>
            #	属性名	类型(约束)	必填	描述
            1	code	String	是	0:成功;其他:失败
            2	message	String	否	失败信息
            3	requestId	String	是	请求标识
            4	data	object	是	业务数据报文
            2.4. 2响应参数<data>
            #	属性名	类型(约束)	必填	描述
            1	uploadUrl	String	是	文件上传地址，链接有效期15分钟，上传成功，此链接失效。
            2.5. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
	            "code": 0,
	            "data": {
		            "uploadUrl": "https://wesign-uat.sit.sf-express.com/wsfile/wesign/fileForQiao/files/upload/24c46eda84374a838ea6b4974fab092d/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.MjRjNDZlZGE4NDM3NGE4MzhlYTZiNDk3NGZhYjA5MmRudWxsMTY1ODgyODY3OTM1Nw.zqcxO2QfiH2H_bmh47U6R2EZlQCaMwBoO1neDcPb0qA"
	            },
	            "message": "成功",
	            "requestId": "1d1c6baa3f1749d"
            }
            失败报文-范例1
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "826221e7a7dd492"
            }
            根据临时地址上传文件
            1. 功能描述
            用于下单电子回单增值服务（IN149-3）时，在获取文件上传地址uploadUrl后，客户通过该Url上传待签署文件上传到微签服务端。

            2.1. 公共参数
            名称	值
            批量交易	不支持
            接口类型	接入
            请求方法	POST
            报文类型	form-data
            2.2. 请求参数
            序号	参数列表	类型	是否必传	含义
            1	file	File	是	合同文件，文件的文件名必须带扩展名，如.pdf；文件限制：多页文件大小需<=20M，单页文件大小需<=9M；文件类型限制：pdf、doc、docx、xls、xlsx、ppt、pptx、wps、jpg、jpeg、bmp、png；文件名请不要包含特殊字符
            2	fileRemark	String	否	文件描述信息
            3	signInfo	String	否	签署信息
            4	preResourceId	String	否	预生成资源id
            2.3. 请求参数<signInfo>  
            序号	参数列表	类型	是否必传	含义
            1	signPos1	WsComponentPosDTO	否	签约区-签名区坐标
            2	signPos3	WsComponentPosDTO	否	备注区坐标
            3	remarkFieldConfig	WsComponentSytleDTO	否	备注区设置
            4	partyType	String	否	参与方类型，“ALL_NM”,任意自然人，“SPECI_NM”,指定自然人，“CONSIGNEE”,指定收件人
            5	signerInfo	List<WsSignerInfoDTO>	否	签署参与人信息，参与方类型为指定自然人的时候必传，任意自然人模式下无需传，若有多个经办人，可以传多个签署参与人信息
            6	cardId	String	否	身份证号码，参与方类型为指定收件人时可填写，当填写时收件人签收时会匹配收件人姓名加收件人身份证号码，不填则仅匹配收件人姓名
            2.3.1. 元素<WsComponentPosDTO>  
            序号	参数列表	类型	是否必传	含义
            1	x	int	否	X轴的坐标
            2	y	int	否	Y轴的坐标
            3	page	int	否	签名区位于文件的页数
            4	signDateBeanType	int	否	签署日期格式，0：不需要签署日期(默认为0)，1：yyyy年MM月dd日，2：yyyy-MM-dd，3：yyyy/MM/dd)
            2.3.2. 元素<WsComponentSytleDTO>   
            序号	参数列表	类型	是否必传	含义
            1	width	int	否	控件的宽度（默认200）
            2	height	int	否	控件的高度（默认50）
            3	fontSize	int	否	控件的文字字号（默认12）
            2.3.3. 元素List<WsSignerInfoDTO>   
            序号	参数列表	类型	是否必传	含义
            1	identityCard	String	否	经办人身份证号码，参与方类型为指定自然人模式下必传，且与经办人名称一 一对应
            2	operatorName	String	否	经办人名字，参与方类型为指定自然人或指定企业模式下必传
            2.4. 响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	object	否		业务数据报文
            2.5. 响应参数<apiResultData>
            #	属性名	类型(约束)	必填	描述
            1	fileId	String		文件唯一id，若之前已上传过，则为旧文件id
            2	name	String		增值服务编码
            3	value	String		增值服务子编码
            4	value1	String		文件id或资源id
            2.6. 请求示例\应用场景(form-data)示例
            file = jkkass.pdf
            fileRemark = test
            signInfo = { "signPos1": { "x": 82, "y": 723, "page": 1, "signDateBeanType": 0 }, "signPos3": { "x": 395, "y": 727, "page": 1 }, "remarkFieldConfig": { "width": 100, "height": 30, "fontSize": 12 }, "partyType": "CONSIGNEE", "signerInfo": { "identityCard": "420982199212013819", "operatorName": "zhangsan" } }
            preResourceId = FILPRE9f56a3f4999c4c508f0597fc38cdeec7
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
	            "apiErrorMsg": "",
	            "apiResponseID": "a20a32d3749d4ab",
	            "apiResultCode": "21000",
	            "apiResultData": {
		            "fileId": "FILPRE9f56a3f4999c4c508f0597fc38cdeec7",
		            "name": "IN149",
		            "value": "3",
		            "value1": "FILPRE9f56a3f4999c4c508f0597fc38cdeec7"
	            }
            }
            失败报文-范例1
            {
	            "apiErrorMsg": "请求时效已过期",
	            "apiResponseID": "51d45530c90e459",
	            "apiResultCode": "21102",
	            "apiResultData": null
            }
            2.8. 返回状态码 
            标识	描述
            21000	成功
            21099	系统异常
            21101	链接无效
            21102	请求时效已过期
            21103	文件正在上传
            21104	必填参数不能为空
            21105	文件类型不匹配
            21106	签署信息格式不合法
            21107	预生成的资源id不存在
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WP_GET_UPLOAD_URL";
            string msgData = "";
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcsString(content, null, environment);
            if (!string.IsNullOrEmpty(result))
            {
                var response = JsonHelper.DeserializeObject<ResponseWpGetPreUploadUrl>(result);
                errmsg = response.apiErrorMsg;
                if (response.apiResultCode == "A1000")
                {
                    var apiResultData = response.apiResultData;
                    errmsg = apiResultData.message;
                    if (apiResultData.code == 0)
                    {
                        errcode = "0";
                        resultdata = JsonHelper.SerializeObject(apiResultData.data);
                    }
                    else
                    {
                        errcode = apiResultData.code.ToString();
                    }
                }
                else
                {
                    errcode = response.apiResultCode;
                    errmsg = response.apiErrorMsg;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }
        /// <summary>
        /// 根据临时地址上传文件
        /// 用于下单电子回单增值服务（IN149-3）时，在获取文件上传地址uploadUrl后，客户通过该Url上传待签署文件上传到微签服务端。
        /// </summary>
        /// <param name="url">临时地址</param>
        /// <param name="fileName"></param>
        /// <param name="fileRemark">文件描述信息 否 String</param>
        /// <param name="signInfo">签署信息 否 String</param>
        /// <param name="preResourceId">预生成资源id 否 String</param>
        /// <returns></returns>
        public static JsonResult WpGetPreUploadFile(string url, string fileName, string fileRemark = "", SignInfo signInfo = null, string preResourceId = "")
        {
            /*
            根据临时地址上传文件
            1. 功能描述
            用于下单电子回单增值服务（IN149-3）时，在获取文件上传地址uploadUrl后，客户通过该Url上传待签署文件上传到微签服务端。

            2.1. 公共参数
            名称	值
            批量交易	不支持
            接口类型	接入
            请求方法	POST
            报文类型	form-data
            2.2. 请求参数
            序号	参数列表	类型	是否必传	含义
            1	file	File	是	合同文件，文件的文件名必须带扩展名，如.pdf；文件限制：多页文件大小需<=20M，单页文件大小需<=9M；文件类型限制：pdf、doc、docx、xls、xlsx、ppt、pptx、wps、jpg、jpeg、bmp、png；文件名请不要包含特殊字符
            2	fileRemark	String	否	文件描述信息
            3	signInfo	String	否	签署信息
            4	preResourceId	String	否	预生成资源id
            2.3. 请求参数<signInfo>  
            序号	参数列表	类型	是否必传	含义
            1	signPos1	WsComponentPosDTO	否	签约区-签名区坐标
            2	signPos3	WsComponentPosDTO	否	备注区坐标
            3	remarkFieldConfig	WsComponentSytleDTO	否	备注区设置
            4	partyType	String	否	参与方类型，“ALL_NM”,任意自然人，“SPECI_NM”,指定自然人，“CONSIGNEE”,指定收件人
            5	signerInfo	List<WsSignerInfoDTO>	否	签署参与人信息，参与方类型为指定自然人的时候必传，任意自然人模式下无需传，若有多个经办人，可以传多个签署参与人信息
            6	cardId	String	否	身份证号码，参与方类型为指定收件人时可填写，当填写时收件人签收时会匹配收件人姓名加收件人身份证号码，不填则仅匹配收件人姓名
            2.3.1. 元素<WsComponentPosDTO>  
            序号	参数列表	类型	是否必传	含义
            1	x	int	否	X轴的坐标
            2	y	int	否	Y轴的坐标
            3	page	int	否	签名区位于文件的页数
            4	signDateBeanType	int	否	签署日期格式，0：不需要签署日期(默认为0)，1：yyyy年MM月dd日，2：yyyy-MM-dd，3：yyyy/MM/dd)
            2.3.2. 元素<WsComponentSytleDTO>   
            序号	参数列表	类型	是否必传	含义
            1	width	int	否	控件的宽度（默认200）
            2	height	int	否	控件的高度（默认50）
            3	fontSize	int	否	控件的文字字号（默认12）
            2.3.3. 元素List<WsSignerInfoDTO>   
            序号	参数列表	类型	是否必传	含义
            1	identityCard	String	否	经办人身份证号码，参与方类型为指定自然人模式下必传，且与经办人名称一 一对应
            2	operatorName	String	否	经办人名字，参与方类型为指定自然人或指定企业模式下必传
            2.4. 响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	object	否		业务数据报文
            2.5. 响应参数<apiResultData>
            #	属性名	类型(约束)	必填	描述
            1	fileId	String		文件唯一id，若之前已上传过，则为旧文件id
            2	name	String		增值服务编码
            3	value	String		增值服务子编码
            4	value1	String		文件id或资源id
            2.6. 请求示例\应用场景(form-data)示例
            file = jkkass.pdf
            fileRemark = test
            signInfo = { "signPos1": { "x": 82, "y": 723, "page": 1, "signDateBeanType": 0 }, "signPos3": { "x": 395, "y": 727, "page": 1 }, "remarkFieldConfig": { "width": 100, "height": 30, "fontSize": 12 }, "partyType": "CONSIGNEE", "signerInfo": { "identityCard": "420982199212013819", "operatorName": "zhangsan" } }
            preResourceId = FILPRE9f56a3f4999c4c508f0597fc38cdeec7
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
	            "apiErrorMsg": "",
	            "apiResponseID": "a20a32d3749d4ab",
	            "apiResultCode": "21000",
	            "apiResultData": {
		            "fileId": "FILPRE9f56a3f4999c4c508f0597fc38cdeec7",
		            "name": "IN149",
		            "value": "3",
		            "value1": "FILPRE9f56a3f4999c4c508f0597fc38cdeec7"
	            }
            }
            失败报文-范例1
            {
	            "apiErrorMsg": "请求时效已过期",
	            "apiResponseID": "51d45530c90e459",
	            "apiResultCode": "21102",
	            "apiResultData": null
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            object data = null;
            if (!string.IsNullOrWhiteSpace(fileRemark))
            {
                if (signInfo != null)
                {
                    if (!string.IsNullOrWhiteSpace(preResourceId))
                    {
                        data = new
                        {
                            fileRemark = fileRemark,
                            signInfo = signInfo,
                            preResourceId = preResourceId
                        };
                    }
                    else
                    {
                        data = new
                        {
                            fileRemark = fileRemark,
                            signInfo = signInfo
                        };
                    }
                }
                else
                {
                    if (!string.IsNullOrWhiteSpace(preResourceId))
                    {
                        data = new
                        {
                            fileRemark = fileRemark,
                            preResourceId = preResourceId
                        };
                    }
                    else
                    {
                        data = new
                        {
                            fileRemark = fileRemark
                        };
                    }
                }
            }
            else
            {
                if (signInfo != null)
                {
                    if (!string.IsNullOrWhiteSpace(preResourceId))
                    {
                        data = new
                        {
                            signInfo = signInfo,
                            preResourceId = preResourceId
                        };
                    }
                    else
                    {
                        data = new
                        {
                            signInfo = signInfo
                        };
                    }
                }
                else
                {
                    if (!string.IsNullOrWhiteSpace(preResourceId))
                    {
                        data = new
                        {
                            preResourceId = preResourceId
                        };
                    }
                }
            }

            string postData = JsonHelper.SerializeObject(data);

            var fileDictionary = new Dictionary<string, string>();
            fileDictionary["file"] = fileName;

            var result = HttpHelper.GetResponseWp(url, postData, fileDictionary);
            if (!string.IsNullOrEmpty(result))
            {
                var response = JsonHelper.DeserializeObject<ResponseWpGetPreUploadFile>(result);
                errmsg = response.apiErrorMsg;
                if (response.apiResultCode == "A1000")
                {
                    errcode = "0";
                    resultdata = JsonHelper.SerializeObject(response.apiResultData);
                }
                else
                {
                    errcode = response.apiResultCode;
                    errmsg = response.apiErrorMsg;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 获取待签署文件上传地址

        /// <summary>
        /// 创建可修改资源
        /// 用于向电子回单增值服务（IN149）创建或修改资源。
        /// 如果入参资源编码为空，会创建资源，生成资源编码；
        /// 如果入参资源编码不为空，不会修改资源编码，但会修改资源编码关联的信息。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微派接口人提供)</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="accessToken"></param>
        /// <param name="environment">调用环境，sfapi：生产环境；ssfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WpCreateUpdateResource(string partnerID, string checkword, string channelCode, MsgDataRequestWpCreateUpdateResource data, string accessToken = "", string environment = "sfapi")
        {
            /*	
            1. 功能描述
            用于向电子回单增值服务（IN149）创建或修改资源。

            如果入参资源编码为空，会创建资源，生成资源编码；
            如果入参资源编码不为空，不会修改资源编码，但会修改资源编码关联的信息。
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WP_CREATE_UPDATE_RESOURCE
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WP_CREATE_UPDATE_RESOURCE）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微派接口人提供)	是	渠道编码
            2.4 请求参数<msgData> /OrderCreateRequest
            序号	参数列表	类型	是否必传	含义
            1	partyType	String	否	签署人类型：SPECI_NAME（收件人），ALL_NM（任意自然人），SPECI_NM（指定自然人），不传取产品默认
            2	resourceCode	String	否	资源编码，如果有传值，为修改资源
            3	fileCode	string	否	文件编码，文件上传模式使用，需上传文件获取
            4	taskSigners	List<SignerInfo>	否	任务签署人信息，签署人类型指定自然人时必传
            5	taskExtra	TaskExtraInfo	否	额外属性，模板方式使用
            2.4.1请求参数taskSigners/List<SignerInfo>
            序号	参数列表	类型	是否必传	含义
            1	psnInfo	PsnInfo	否	签署人信息
            2	signAreas	List<SignArea>	否	签署区域
            2.4.1.1请求参数psnInfo/PsnInfo
            序号	参数列表	类型	是否必传	含义
            1	name	String	否	签署人姓名
            2	idNumber	String	否	签署人身份证号
            2.4.1.2请求参数signAreas/List<SignArea>
            序号	参数列表	类型	是否必传	含义
            1	signFieldType	String	否	组件类型，SIGN 普通签署区，REMARK 备注区域，不传此参数默认为 普通签署区
            2	signFieldConfig	SignFieldConfig	否	签章区配置项（当signFieldType为 SIGN 时，该参数为必传）
            3	remarkFieldConfig	RemarkFieldConfig	否	备注区配置项（当signFieldType为 REMARK 时，该参数为必传）
            2.4.1.2.1请求参数signFieldConfig/SignFieldConfig
            序号	参数列表	类型	是否必传	含义
            1	calcPosConfig	CalcPosConfig	否	坐标计算
            2	dateFormat	SignFieldConfig	否	签署日期类型，YYYYMMDD1（yyyy年MM月dd日），YYYYMMDD2（yyyy-MM-dd），YYYYMMDD13（yyyy/MM/dd）
            3	position	Position	否	签署区位置
            2.4.1.2.2.1请求参数calcPosConfig/CalcPosConfig
            序号	参数列表	类型	是否必传	含义
            1	calcPage	String	否	坐标使用的页码，LAST_PAGE（最后一页），SPECI_PAGE（指定页码）
            2	calcPosType	String	否	计算坐标类型，BOTTOM_LEFT（左下角），TOP_LEFT（左上角），BOTTOM_RIGHT（右下角），TOP_RIGHT（右上角），FREE_POS（自定义坐标）
            2.4.1.2.2.2请求参数position/Position
            序号	参数列表	类型	是否必传	含义
            1	pageNum	Integer	否	页码
            2	positionX	Integer	否	坐标X，左下角为原点，签署区为区域位置为中心点，备注区为区域左下角
            3	positionY	Integer	否	坐标Y，左下角为原点，签署区为区域位置为中心点，备注区为区域左下角
            2.4.1.1.1.1请求参数remarkFieldConfig/RemarkFieldConfig
            序号	参数列表	类型	是否必传	含义
            1	remarkFontSize	Integer	否	备注文字字号，默认给12
            2	signFieldHeight	Integer	是	备注签署区的高度
            3	signFieldWidth	Integer	是	备注签署区的宽度
            4	calcPosConfig	Integer	否	坐标计算
            5	position	Position	否	签署区位置
            2.4.2请求参数taskExtra/TaskExtraInfo
            序号	参数列表	类型	是否必传	含义
            1	componentFields	ComponentField	否	模板字段信息，微签提供字段，客户传字段key 对应的value值
            2.4.2.1请求参数componentFields/List<ComponentField>
            序号	参数列表	类型	是否必传	含义
            1	key	String	否	控件Key（设置合同文件模板时由用户自定义）
            2	value	Object	否	控件值（用户下单填充）
            2.7 请求示例\应用场景(JSON)示例
            请求报文：

            示例1，文件上传方式
            {
	            "partyType": "SPECI_NM",
	            "fileCode": "FL...",
	            "taskSigners": [{
		            "psnInfo": {
			            "name": "李雷",
			            "idNumber": "11010119900307133X"
		            },
		            "signAreas": [{
			            "signFieldType": "SIGN",
			            "signFieldConfig": {
				            "dateFormat": "YYYYMMDD1",
				            "position": {
					            "pageNum": 1,
					            "positionX": 80,
					            "positionY": 80
				            }
			            }
		            }, {
			            "signFieldType": "REMARK",
			            "remarkFieldConfig": {
				            "signFieldHeight": 100,
				            "signFieldWidth": 200,
				            "position": {
					            "pageNum": 1,
					            "positionX": 0,
					            "positionY": 0
				            }
			            }
		            }]
	            }]
            }
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表 示接口层的请求果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object	否	处理结果
            2.6.1响应参数<data> / object
            #	属性名	类型(约束)	必填	描述
            1	resourceCode	String	是	资源编码
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应
            {
	            "code": 0,
	            "message": "成功",
	            "data": {
		            "resourceCode": "RES23042400002324"
	            },
	            "requestId": "826221e7a7dd492"
            }
            失败报文-范例1
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "826221e7a7dd492"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WP_CREATE_UPDATE_RESOURCE";
            string msgData = "";
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcsString(content, null, environment);
            if (!string.IsNullOrEmpty(result))
            {
                var response = JsonHelper.DeserializeObject<ResponseWpCreateUpdateResource>(result);
                errmsg = response.apiErrorMsg;
                if (response.apiResultCode == "A1000")
                {
                    var apiResultData = response.apiResultData;
                    errmsg = apiResultData.message;
                    if (apiResultData.code == 0)
                    {
                        errcode = "0";
                        resultdata = JsonHelper.SerializeObject(apiResultData.data);
                    }
                    else
                    {
                        errcode = apiResultData.code.ToString();
                    }
                }
                else
                {
                    errcode = response.apiResultCode;
                    errmsg = response.apiErrorMsg;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /*
         * 上传待签署文件 COM_RECE_WP_GET_FILE_UPLOAD_URL
         * 
         * 同  微签服务类接口  WsGetFileUploadUrl
         */

        #endregion 微派服务类接口

        #region 售后投诉理赔服务类接口

        /// <summary>
        /// 大客户对接售后客服创建工单接口
        /// 此接口用于客户向顺丰侧推送工单信息，请传入工单创建必要信息。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult AmisSpecialTaskCreate(string partnerID, string checkword, MsgDataRequestAmisSpecialTaskCreate data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            1. 功能描述
            此接口用于客户向顺丰侧推送工单信息，请传入工单创建必要信息。
            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	EXP_RECE_QUERY_DELIVERTM
            生产环境地址	https://bspgw.sf-express.com/std/service
            香港生产环境	https://sfapi-hk.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	Number	条件	访问令牌，使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            #	属性名	类型（约束）	必填	默认值	描述
            1	requestContent	String	Y		请求内容按照实际接口参数内容填充,转为json字符串传输
            2	signature	String	N		签名
            3	requestId	String	N		请求id
            4	timestamp	String	N		时间戳
            2.3.1 元素<请求> requestContent

            #	属性名	类型（约束）	必填	默认值	描述
            1	waybillNo	String(30)	是		运单号
            2	customerTaskId	String(100)	是		客户侧工单ID
            3	operationType	String(20)	是		操作类型：create提交，append追加，continue继续处理，cancel撤销（结单状态），close关闭（结单状态）接口传递编码即可
            4	requirementRole	String(20)	是		需求方，1寄方、2收方、3第三方
            5	requirementTel	String(300)	是		需求方联系电话，消费者联系电话，优先取手机号
            6	issueTypeLevel1	String(30)	是		外部一级工单类型编码
            7	issueTypeLevel2	String(30)	否		外部二级工单类型编码
            8	issueTypeLevel3	String(30)	否		外部三级工单类型编码
            9	status	String(5)	是		工单状态：01待处 02处理中 03已关闭
            10	remark	String(500)	是		问题描述
            11	createTime	Long	是		工单创建时间，毫秒时间戳
            12	fileUrls	String(500)	否		附件列表
            13	extendField	String(2000)	否		扩展参数
            请求报文:

            {
                "waybillNo": "666928647735",
                "requirementTel": "186XXXXXXXX",
                "requirementRole": "2",
                "taskType": "700181101",
                "remark": "发起工单",
                "fileUrls": [
                    "http://xxx/xxx.png”,
                    "http://xxx/yyy.png"
                ],
                "extendField": {
	            “test”:”test”
                }
            }
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	是		错误编码，S0000成功
            3	errorMsg	String	是		错误描述
            4	msgData	String	是		返回的详细数据
            2.5. 响应参数<msgData>
            #	属性名	类型（约束	必填	默认值	描述
            1	taskId	String			顺丰测工单ID
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "success": true,
                "errorCode": null,
                "errorMessage": null,
                "data ": {
                    "taskId": "uuid123",
                }
            }
            失败报文-范例1
            {
                "success": false,
                "errorCode": "",
                "errorMessage": "",
                "data ":null
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明	解决方法
            A1000	统一接入平台校验成功，调用后端服务成功;
            注意：
            不代表后端业务处理成功，实际业务处理结果，
            需要查看响应属性apiResultData中的详细结果	表示接口调用正常
            A1001	必传参数不可为空	请做以下几点检查：
            1、参数列表必传字段未填写
            2、请求报文头，未配置Content-type：application/x-www-form-urlencoded
            3、参数key存在空格问题
            4、http请求参数都通过http URL编码传送
            5、业务数据报文（msgData）为json报文数据格式
            6、接口整体报文为form表单
            A1002	请求时效已过期	使用OAuth2认证会产生该提示
            请检查业务接口的accessToken参数是否超过2小时，2小时口令会更新，请调用OAuth2认证接口重新获取
            A1003	IP无效	顾客编码（partnerID）配置了需校验IP，请解除校验或按绑定IP调用接口
            A1004	无对应服务权限	可能存在的原因：
            1、顾客编码（partnerID）没有配置（关联）对应接口的业务接口，请在【开发者对接】-【API列表】中关联；
            2、接口请求数据与实际环境不一致，请先查看【开发者对接】-【API列表】接口状态：
            a、【测试中】请使用沙箱环境
            b、【已上线】请使用正式环境；
            3、后台配置没有生效，可等待2分钟后在试试，如果还是无法操作，请报障人工处理
            A1005	流量受控	丰桥为接口功能联调环境，接口整体都有限流管控，单客户编码对应的每个接口限流规则：
            1、单接口调用30次/s 2、单接口调用3000次/天
            请尽量只操作功能联调，切勿进行接口压测，谢谢！
            A1006	数字签名无效	请做以下几点检查：
            1、确认checkword是否配置正确
            2、确认verifyCode、msgDigest是否加密加签正确
            3、确认参数是否有特殊字符，如：&
            4、参数整体式form表单格式
            5、非java类语言，需注意特殊字符，目前支持的特殊字符“*”，“空格”，“-”请优先使用
            6、如果数字签名操作不便，可改为OAuth2认证，Token交互即可，具体参见【开发规范】【鉴权方式说明】
            A1007	重复请求	接口层暂未启用，业务层主要是针对下单接口，客户请求参数msgData中的orderId请不要重复使用，修改后在调用接口
            A1008	数据解密失败	在特殊场景中使用，如有出现请报障人工处理
            A1009	目标服务异常或不可达	接口下游服务异常，如有出现请报障人工处理
            A1010	状态为沙箱测试	该问题在老客户中会有此类问题，新客户不会出现，如有出现请报障人工处理
            A1099	系统异常	接口服务异常，如有出现请报障人工处理
            3.2 业务异常代码
            接口错误码定义
            0001：接口功能未开通
            0002：参数Json转换异常
            0003：参数校验失败（XXX参数不能为空、参数值不合法）
            1001：运单不存在
            1002：发起工单失败
            3003：工单不存在
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_AMIS_SPECIAL_TASK_CREATE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseAmisSpecialTaskCreate>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.msgData);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 售后投诉理赔服务类接口

        #region 丰修服务类接口

        /// <summary>
        /// 丰修下发检测服务
        /// 注意事项:
        /// 同一批次顺丰运单路由信息必须为同一语言。
        /// 目前支持中文简体,中文繁体和英文。
        /// 可在服务与支持—>业务文档查看。
        /// 定制路由查询须与顺丰商务人员沟通，客户可基于顺丰所有路由节点（列表可从顺丰商务人员处获取）定制所需的路由节点及其具体描述与操作码。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult EosAwsmCodeCheckService(string partnerID, string checkword, MsgDataRequestEosAwsmCodeCheckService data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            2.1公共参数
            名称	值
            接口服务代码	EXP_RECE_SEARCH_ROUTES
            生产环境地址	https://bspgw.sf-express.com/std/service
            香港生产环境	https://sfapi-hk.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（EXP_RECE_SEARCH_ROUTES）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            字段名	字段类型	是否必填	字段描述
            waybillNo	string	是	运单号
            sysCode	string	是	系统编码
            operatorId	string	是	操作人
            sendTimestamp	long	是	时间戳(毫秒)
            type	string	是	类型（1: 通缉 2: 放行 3: 退回）
            案例
            {
                "waybillNo": "668548751791",    // 运单号
                "sysCode": "INC-SFFIX-PLAT",    // 系统编码
                "operatorId": "01403320",       // 操作人
                "sendTimestamp": 1664203995000, // 时间戳
                "type": "1"     // 类型（1: 通缉 2: 放行 3: 退回）
            }
            2.4. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是	true	请求成功，false 请求失败
            2	errorCode	String	是		错误编码，S0000成功
            3	errorMsg	String	是		错误描述
            4	msgData	String	是		返回的详细数据
            2.4.1 msgData
            字段	类型	默认值	描述
            success	boolean	true	成功

            返回参数
            // 成功
            {
                "success": true
            }

            // 失败
            {
                "success": false,
                "errorCode": "10005",
                "errorMessage": "数据已存在"
            }

            **
            注意事项:**

            同一批次顺丰运单路由信息必须为同一语言。

            目前支持中文简体,中文繁体和英文。

            可在服务与支持—>业务文档查看。

            定制路由查询须与顺丰商务人员沟通，客户可基于顺丰所有路由节点（列表可从顺丰商务人员处获取）定制所需的路由节点及其具体描述与操作码。

            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明	【处理建议】
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果	
            A1001	必传参数不可为空	serviceCode partnerID requestID timestamp msgDigest msgData 不可为空
            A1002	请求时效已过期	时效参考auth2 https://open.sf-express.com/customerService/395002?interId=590549&faqId=4
            A1003	IP无效	参考常见问题 https://open.sf-express.com/customerService/395002?activeIndex=905584&interId=590549&faqId=2
            A1004	无对应服务权限	联系销售经理，配置权限
            A1005	流量受控	测试环境流量限制为5000，请不要在测试环境做压测
            A1006	数字签名无效	参考常见问题 签名加解密问题 https://open.sf-express.com/customerService/395002?activeIndex=905584&interId=795986
            A1007	重复请求	过一分钟在尝试
            A1008	数据解密失败	
            A1009	目标服务异常或不可达	联系销售经理，配置权限
            A1099	系统异常	过一分钟在尝试
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_EOS_AWSM_CORE_CHECK_SERVICE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseEosAwsmCodeCheckService>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMsg;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 丰修服务类接口

        #region 丰拓服务类接口

        #endregion 丰拓服务类接口

        #region 智慧快递助手服务类接口

        #endregion 智慧快递助手服务类接口

        #region 顺势物联服务类接口

        #endregion 顺势物联服务类接口

        #region 微签服务类接口

        /// <summary>
        /// 异步批量下单接口
        /// 用于下微签（电子回单）订单，此接口仅实时校验参数是否合规，下单状态由下单状态推送接口异步回调告知。
        /// 批量下单的最大限制为20单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WsSyncOrder(string partnerID, string checkword, string channelCode, MsgDataRequestWsSyncOrder data, string accessToken = "", string environment = "sfapi")
        {
            /*
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WS_SYNC_ORDER
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WS_SYNC_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)	是	渠道编码
            2.4 请求参数<msgData> /OrderCreateRequest
            序号	参数列表	类型	是否必传	含义
            1	productCode	String	是	产品编码，微签提供
            2	createUser	String	是	订单创建人，客户提供，仅留存使用
            3	taskOrderInfos	List<TaskOrderInfoVO>	是	订单信息
            2.4.1请求参数<taskOrderInfos> /List<TaskOrderInfoVO>
            序号	参数列表	类型	是否必传	含义
            1	taskSigners	List<SignerInfoVO>	是	任务签署人信息，客户提供
            2	businessId	String	是	客户订单号，客户提供，识别订单的标识，同一商户订单号 不能重复下单
            3	displayNo	String	否	展示单号，客户提供，签署小程序展示的单号，不传默认businessId
            4	fileCode	String	否	文件编码
            5	taskExtra	TaskExtraInfo	否	额外属性
            2.4.1.1请求参数<taskSigners>/List<SignerInfoVO>
            序号	参数列表	类型	是否必传	含义
            1	signerType	String	是	签署方类型，**枚举:**PERSON ,ORG，枚举备注: 个人 机构
            2	signSeq	Integer	否	签署顺序，多人签署必传，从1开始，按顺序签署
            3	psnInfo	PsnInfoVO	否	签署人信息，签署方类型为PERSON传该对象
            4	orgInfo	OrgInfoVO	否	机构信息，企业签署 必传，签署方类型为ORG传该对象
            2.4.1.1.1请求参数<psnInfo>/PsnInfoVO
            序号	参数列表	类型	是否必传	含义
            1	name	String	否	个人用户姓名
            2	idNumber	String	否	个人证件号
            3	mobileNo	String	否	手机号
            2.4.1.1.2请求参数<orgInfo>/OrgInfoVO
            序号	参数列表	类型	是否必传	含义
            1	sealId	String	否	印章id，客户提供，签署机构生成的印章id
            2	orgCode	String	否	企业编码，微签提供，微签依据企业生成的唯一企业编码
            3	orgName	String	否	企业名称
            4	deptName	String	否	部门名称
            5	transactorInfo	PsnInfoVO	否	经办人信息
            2.4.1.2请求参数<taskExtra>/TaskExtraInfo
            序号	参数列表	类型	是否必传	含义
            1	componentFields	ComponentField	否	模板字段信息，微签提供字段，客户传字段key 对应的value值
            2	additionalTasks	List<AdditionalTask>	否	附加任务
            2.4.1.2.1请求参数<componentFields>/ComponentField
            序号	参数列表	类型	是否必传	含义
            1	key	String	否	控件Key（设置合同文件模板时由用户自定义）
            2	value	Object	否	控件值（用户下单填充）
            2.4.1.2.2 additionalTasks/List<AdditionalTask>
            #	属性名	类型(约束)	必填	默认值	描述
            1	type	string	否		扩展任务类型 INVENTORY–明细清点 BRIEF_INVENTORY–整箱清点
            2	seq	string	否		扩展任务执行顺序:BEFORE_SIGN,AFTER_SIGN
            5	items	List<Item>	否		清点内容
            2.4.1.2.2.1 items/List<Item>

            #	属性名	类型(约束)	必填	默认值	描述
            1	tabSeq	int	否		列表排序
            2	content	Map	否		内容map
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表 示接口层的请求果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object[]	否	处理结果
            2.6.1响应参数<data> / object[]
            #	属性名	类型(约束)	必填	描述
            1	taskNo	String	是	微签订单号
            2	businessId	String	是	客户订单号
            3	success	Boolean	是	预下单结果：true 成功, false 失败
            4	errorMessage	String	是	下单失败原因描 述，success为false 时必填
            5	errorCode	Integer	是	错误状态码
            2.7 请求示例\应用场景(JSON)示例
            请求报文：

            示例1，文件上传方式，单个签署
            {
                "createUser": "234",
                "productCode": "PRO230207001087",
                "taskOrderInfos": [
                    {
                        "businessId": "SF123456789632",
                        "displayNo":"SF4000005855107",
                        "fileCode":"FL23012900002207",
                        "taskSigners": [
                            {
                                "psnInfo": {
                                        "name": "李雷",
                                        "idNumber": "11010119900307133X",
                                        "mobileNo": "13800001111"
                                },
                                "signerType": "PERSON",
                                "signSeq": 1
                            }
                        ]
                    }
                ]
            }
            示例2，模板传输方式，会签
            {
                "createUser": "234",
                "productCode": "PRO221230001263",
                "taskOrderInfos": [
                    {
                        "businessId": "SF123456789123",
                        "taskExtra": {
                            "componentFields": [
                                {
                                    "key": "Origin",
                                    "value": "广东省深圳市南山区深投控创智天地大厦"
                                }
                            ]
                        },
                        "taskSigners": [
                            {
                                "psnInfo":                    
                 {

                                    "idNumber": "110101199003074610",
                                    "mobileNo": "18455556666",
                                    "name": "韩梅梅"
                                    },
                                "signerType": "PERSON",
                                "signSeq": 2
                            },
                            {
                                "orgInfo": {
                                    "sealId": "6e3bca25-e239-4346-b395-0a669145dd8c",
                                    "orgCode": "ORG23423411",
                                    "transactorInfo": {

                                        "name": "李雷",
                                        "idNumber": "11010119900307133X",
                                        "mobileNo": "13800001111"
                                } 
                                },
                                "signerType": "ORG",
                                "signSeq": 1
                            }
                        ]
                    }
                ]
            }
            示例3，文件上传方式，企业任意经办人签 + 清点

            {
                "createUser": "234",
                "productCode": "PRO221230001263",
                "taskOrderInfos": [{
                    "businessId": "SF123456789123",
                    "fileCode": "FL23012900002207",
                    "taskExtra": {
                        "additionalTasks": [{
                            "type": "INVENTORY",
                            "seq": "AFTER_SIGN",
                            "items": [{
                                "content": {
                                    "count": 3,
                                    "name": "风油精"
                                }
                            }]
                        }]
                    },
                    "taskSigners": [{
                            "psnInfo": {
                                "name": "韩梅梅"
                            },
                            "signerType": "PERSON",
                            "signSeq": 1
                        },
                        {
                            "orgInfo": {
                                "orgName": "测试企业",
                            "deptName":"测试部门",	
                                "transactorInfo": {
                                    "mobileNo": "13800001111"
                                }
                            },
                            "signerType": "ORG",
                            "signSeq": 1
                        }
                    ]
                }]
            }
            示例4，文件上传方式，企业任意自然人签 + 清点

            {
                "createUser": "234",
                "productCode": "PRO221230001263",
                "taskOrderInfos": [{
                    "businessId": "SF123456789123",
                    "fileCode": "FL23012900002207",
                    "taskExtra": {
                        "additionalTasks": [{
                            "type": "INVENTORY",
                            "seq": "AFTER_SIGN",
                            "items": [{
                                "content": {
                                    "count": 3,
                                    "name": "风油精"
                                }
                            }]
                        }]
                    },
                    "taskSigners": [{
                        "orgInfo": {
                            "orgName": "测试企业"
                        "deptName":"测试部门",	
                        },
                        "signerType": "PERSON",
                        "signSeq": 1
                    }]
                }]
            }
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应
            {
              "code": 0,
              "message": "成功",
              "data": [
                {
                  "taskNo": "WS221117063541",
                  "businessId": "SF100000000000",
                  "success": true,
                  "errorMessage": null,
                  "errorCode":null
                }
              ],
              "requestId": "826221e7a7dd492"
            }
            失败报文-范例1
            {
                "code": 100001,
                "data": null,
                "message": "请求参数异常",
                "requestId": "826221e7a7dd492"
            }
            失败报文-范例2
            {
                "requestId": "826221e7a7dd492",
                "code": 0,
                "message": "成功",
                "data": [
                    {
                        "success": false,
                        "errorMessage": "商户订单号已存在，请勿重复下单",
                        "errorCode": 80013,
                        "businessId": "sd11asddas",
                        "taskNo": "WS23020200008331"
                    }
                ]
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WS_SYNC_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseWsSyncOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.code == 0)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.code.ToString();
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 同步批量订单取消接口
        /// 用于取消微签（电子回单）订单，此接口实时返回取消状态，支持任务状态为未创建、已创建、处理中的订单取消，任务状态为完成、取消、失败的订单不允许取消。批量取消的最大限制为20单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WsCancelOrder(string partnerID, string checkword, string channelCode, MsgDataRequestWsCancelOrder data, string accessToken = "", string environment = "sfapi")
        {
            /*
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WS_CANCEL_ORDER
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WS_CANCEL_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)	是	渠道编码
            2.4 请求参数<msgData> /OrderCancelRequest
            序号	参数列表	类型	是否必传	含义
            1	orders	List<OrderCommonRequest>	是	订单集合
            2.4.1请求参数<orders> /List<OrderCommonRequest>
            序号	参数列表	类型	是否必传	含义
            1	taskNo	String	否	微签订单号，二选一，都传以微签订单号为准
            2	businessId	String	否	客户订单号，二选一，都传以微签订单号为准
            2.7 请求示例\应用场景(JSON)示例
            请求报文:

            {
                    "orders": [
                        {
                            "businessId": "",
                            "taskNo": "WS22121900003756"
                        }
                    ]
            }
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表 示接口层的请求果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object[]	否	处理结果
            2.6.1响应参数<data> / object[] 
            #	属性名	类型(约束)	必填	描述
            1	taskNo	String	是	微签订单号
            2	businessId	String	是	客户订单号
            3	success	Boolean	是	取消结果：true 成功, false 失败
            4	errorMessage	String	否	取消失败原因描 述，success为false时必填
            5	errorCode	Integer	否	错误状态码
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "code": 0,
              "message": "成功",
              "data": [
                {
                  "taskNo": "WS22121900003756",
                  "businessId": "SF100000000000",
                  "success": true,
                  "errorMessage": null,
                  "errorCode":null
                }
              ],
              "requestId": "sdaff128128981229snfa"
            }
            失败报文-范例1
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "sdaff128128981229snfa"
            }
            失败报文-范例2
            {
                "requestId": "sdaff128128981229snfa",
                "code": 0,
                "message": "成功",
                "data": [
                    {
                        "success": false,
                        "errorMessage": "订单不存在",
                        "errorCode": null,
                        "businessId": null,
                        "taskNo": "WS22121900003756"
                    }
                ]
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WS_CANCEL_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseWsCancelOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.code == 0)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.code.ToString();
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 下单状态批量查询接口
        /// 用于客户查询微签订单的下单状态，批量查询的最大限制为20单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WsQueryOrder(string partnerID, string checkword, string channelCode, MsgDataRequestWsQueryOrder data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            用于客户查询微签订单的下单状态，批量查询的最大限制为20单

            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WS_QUERY_STATUS
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WS_QUERY_STATUS）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)	是	渠道编码
            2.4 请求参数<msgData> /OrderCancelRequest
            序号	参数列表	类型	是否必传	含义
            1	orders	List<OrderCommonRequest>	是	订单集合
            2.4.1请求参数<orders> /List<OrderCommonRequest>
            序号	参数列表	类型	是否必传	含义
            1	taskNo	String	否	微签订单号，二选一，都传以微签订单号为准
            2	businessId	String	否	客户订单号，二选一，都传以微签订单号为准
            2.7 请求示例\应用场景(JSON)示例
            请求报文:

            {
              "orders": [
                {
                  "businessId": "",
                  "taskNo": "WS221117063541"
                }
              ]
            }
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表 示接口层的请求结果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object[]	否	处理结果
            2.6.1响应参数<data> / object[] 
            #	属性名	类型(约束)	必填	描述
            1	taskNo	String	是	微签订单号
            2	businessId	String	是	客户订单号
            3	status	String	是	微签下单状态，枚举: ORDER_CREATED ,ORDER_CREATING ,ORDER_CREATION_FAIL
            枚举备注: 下单成功 下单创建中 下单失败
            4	success	Boolean	是	查询结果：true 成功, false 失败
            5	errorMessage	String	否	查询失败原因描述，success为false 时必填
            6	errorCode	Integer	否	错误状态码
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "code": 0,
              "message": "成功",
              "data": [
                {
                  "taskNo": "WS221117063541",
                  "businessId": "SF100000000000",
                  "status": "ORDER_CREATED",
                  "success": true,
                  "errorMessage": null
                }
              ],
              "requestId": "sdaff128128981229snfa"
            }
            失败报文-范例1
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "sdaff128128981229snfa"
            }
            失败报文-范例2
            {
                "requestId": "sdaff128128981229snfa",
                "code": 0,
                "message": "成功",
                "data": [
                    {
                        "success": false,
                        "errorMessage": "订单不存在",
                        "errorCode": null,
                        "businessId": null,
                        "taskNo": "WS22121900003756"
                    }
                ]
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WS_QUERY_STATUS";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseWsQueryOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.code == 0)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.code.ToString();
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 任务状态批量查询接口
        /// 用于客户查询微签任务的实时状态，批量查询的最大限制为20单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WsQueryTaskStatus(string partnerID, string checkword, string channelCode, MsgDataRequestWsQueryTaskStatus data, string accessToken = "", string environment = "sfapi")
        {
            /*
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WS_QUERY_TASK_STATUS
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WS_QUERY_TASK_STATUS）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)	是	渠道编码
            2.4 请求参数<msgData> /OrderCancelRequest
            序号	参数列表	类型	是否必传	含义
            1	orders	List<OrderCommonRequest>	是	订单集合
            2.4.1请求参数<orders> /List<OrderCommonRequest>
            序号	参数列表	类型	是否必传	含义
            1	taskNo	String	否	微签订单号，二选一，都传以微签订单号为准
            2	businessId	String	否	客户订单号，二选一，都传以微签订单号为准
            2.7 请求示例\应用场景(JSON)示例
            请求报文:

            {
                    "orders": [
                        {
                            "businessId": "",
                            "taskNo": "WS22121900003756"
                        }
                    ]
            }
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表 示接口层的请求结果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object[]	否	处理结果
            2.6.1响应参数<data> / object[]
            #	属性名	类型(约束)	必填	描述
            1	taskNo	String	是	微签订单号
            2	businessId	String	是	客户订单号
            3	taskStatus	String	是	微签任务状态，枚举: NOT_CREATED,CREATED,PROCESSING,COMPLETE,FAIL,CANCEL
            枚举备注: 未创建 已创建 处理中 完成 失败 取消
            4	signInfos	List<SignInfoDTO>	是	签署信息
            5	extraInfo	Object	否	额外信息
            4	success	Boolean	是	查询结果：true 成功, false 失败
            5	errorMessage	String	否	查询失败原因描述，success为false 时必填
            6	errorCode	Integer	否	错误状态码
            2.6.1.1 <signInfos> / List<SignInfoDTO>
            #	属性名	类型(约束)	必填	默认值	描述
            1	name	String	是		个人用户姓名
            2	signSeq	String	是		签署顺序
            3	signStatus	String	是		签署状态，枚举: DRAFT ,SIGNING ,COMPLETE ,REVOKE
            枚举备注: 待签署 签署中 完成 撤销
            4	remark	String	否		描述信息
            2.6.1.2 extraInfo /Object
            #	属性名	类型(约束)	必填	默认值	描述
            1	additionalTasks	List<AdditionalTask>	否		附加任务
            2.6.1.2 .1 additionalTasks/List<AdditionalTask>
            #	属性名	类型(约束)	必填	默认值	描述
            1	type	string	否		扩展任务类型 INVENTORY–明细清点 BRIEF_INVENTORY–整箱清点
            2	seq	string	否		扩展任务执行顺序:BEFORE_SIGN,AFTER_SIGN
            3	status	string	否		状态:INIT–待清点,PROCESSING–清点中,COMPLETE–清点完成
            4	hasDiff	boolean	否		是否包含异常
            5	errorItems	List<Item>	否		异常内容
            2.6.1.2 .1.1 errorItems/List<Item>

            #	属性名	类型(约束)	必填	默认值	描述
            1	content	Map	否		内容map
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "code":0,
                "message":"成功",
                "data":[
                    {
                        "taskNo":"WS221117063541",
                        "businessId":"SF100000000000",
                        "taskStatus":"CREATING",
                        "signInfos":[
                            {
                                "name":"张三",
                                "signSeq":1,
                                "signStatus":"COMPLETE",
                                "remark":""
                            },
                            {
                                "name":"李四",
                                "signSeq":2,
                                "signStatus":"SIGNING",
                                "remark":""
                            }
                        ],
                        "extraInfo":{
                            "contractId":"22041899675185"
                        },
                        "success":true,
                        "errorMessage":null
                    }
                ],
                "requestId":"sdaff128128981229snfa"
            }
            失败报文-范例1
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "sdaff128128981229snfa"
            }
            失败报文-范例2
            {
                "requestId": "sdaff128128981229snfa",
                "code": 0,
                "message": "成功",
                "data": [
                    {
                        "success": false,
                        "errorMessage": "订单不存在",
                        "errorCode": null,
                        "businessId": null,
                        "taskNo": "WS22121900003756"
                    }
                ]
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WS_QUERY_TASK_STATUS";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseWsQueryTaskStatus>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.code == 0)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.code.ToString();
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 获取订单签署文件
        /// 用于客户查询已签署的微签文件，签署文件类型目前固定是pdf格式；接口响应后返回文件的下载地址，客户需在查询后1小时内下载和保存
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WsGetFile(string partnerID, string checkword, string channelCode, MsgDataRequestWsGetFile data, string accessToken = "", string environment = "sfapi")
        {
            /*
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WS_GET_FILE
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WS_GET_FILE）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)	是	渠道编码
            2.4 请求参数<msgData> /OrderCommonRequest
            序号	参数列表	类型	是否必传	含义
            1	taskNo	String	否	微签订单号，二选一，都传以微签订单号为准
            2	businessId	String	否	客户订单号，二选一，都传以微签订单号为准
            3	fileType	String	否	文件状态（PENDING-待签署；COMPLETE-签署完成,；INVENTORY-清点；默认COMPLETE）
            2.7 请求示例\应用场景(JSON)示例
            请求报文:

            {
              "taskNo": "WS221117063541",
              "businessId": "SF100000000000",
            }
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表 示接口层的请求果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object	否	处理结果
            2.6.1响应参数<data> / object
            #	属性名	类型(约束)	必填	描述
            1	docs	List<OrderFileDTO>	是	文件信息
            2	expireTime	Long	是	有效截止时间戳（秒）
            2.6.1.1响应参数<docs> /List<OrderFileDTO>
            #	属性名	类型(约束)	必填	描述
            1	name	String	是	文件名称
            2	url	String	是	文件url
            3	extensiveName	String	是	文件扩展名
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
            "code": 0,
               "message": "成功",
               "data": {
            "docs": [{
                  "name": "签署文件1.pdf",
                   "url": "https://wesign\\-sit\\-1256483133\\.cos\\.ap\\-guangzhou\\.myqcloud\\.com/wesign/files/2022/11/18/FILE221118000001\\.pdf?sign=q\\-sign\\-algorithm=sha1&q\\-ak=AKIDSbKrtfHMWbk3155gGobIBHb4eRXGGLlFhOh1d\\-19WjKCO0P6bPe48mRwFAB9vSt9&q\\-sign\\-time=1668763666;1668767266&q\\-key\\-time=1668763666;1668767266&q\\-header\\-list=host&q\\-url\\-param\\-list=&q\\-signature=1886980753f3f67a584bd5340e8915c884416e0f&x\\-cos\\-security\\-token=h9OALGEL9RBXUxEmTVaJl337sNza0zNa27cb5639d90d2d535a659cb78df7fe453utHc09pk1kgk87el5mjqzUvx7bfUrRqvFN3ZG2Mh36m8Pn\\_KMKVdMqQYzWJOxxmhVDSL9omWCKHKISv3MmvMVwOy\\-Vvj6fPAhKNHJAjzwIOLuoGsiFv\\-\\_HyGQIcquKvm8Tanz6OBpr0hfWRqh3yLOqyHSwMGxl9SPYLdRJyfBgCgjPjx4h8g1kzncP0SE\\-o5\\-ZmB9yt13yi7W\\-wmA7DOw6lF7eGYhHzmCP4I4aN44BNtDGagLce9H3\\_x3sz9CYOVepu99Blw5lLAjgwcLwpDiI7c29mMeshOifxNSfBbdI](https://wesign\-sit\-1256483133\.cos\.ap\-guangzhou\.myqcloud\.com/wesign/files/2022/11/18/FILE221118000001\.pdf?sign=q\-sign\-algorithm=sha1&q\-ak=AKIDSbKrtfHMWbk3155gGobIBHb4eRXGGLlFhOh1d\-19WjKCO0P6bPe48mRwFAB9vSt9&q\-sign\-time=1668763666;1668767266&q\-key\-time=1668763666;1668767266&q\-header\-list=host&q\-url\-param\-list=&q\-signature=1886980753f3f67a584bd5340e8915c884416e0f&x\-cos\-security\-token=h9OALGEL9RBXUxEmTVaJl337sNza0zNa27cb5639d90d2d535a659cb78df7fe453utHc09pk1kgk87el5mjqzUvx7bfUrRqvFN3ZG2Mh36m8Pn\_KMKVdMqQYzWJOxxmhVDSL9omWCKHKISv3MmvMVwOy\-Vvj6fPAhKNHJAjzwIOLuoGsiFv\-\_HyGQIcquKvm8Tanz6OBpr0hfWRqh3yLOqyHSwMGxl9SPYLdRJyfBgCgjPjx4h8g1kzncP0SE\-o5\-ZmB9yt13yi7W\-wmA7DOw6lF7eGYhHzmCP4I4aN44BNtDGagLce9H3\_x3sz9CYOVepu99Blw5lLAjgwcLwpDiI7c29mMeshOifxNSfBbdI)",
                "extensiveName": "pdf"
                }],
                   "expiresTime": 1668768520
                  },
               "requestId": "sdaff128128981229snfa"
            }
            失败报文-范例1
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "sdaff128128981229snfa"
            }
            失败报文-范例2
            {
                "requestId": "84c4e16dd047490",
                "code": 60002,
                "message": "查询流程文件需流程完成",
                "data": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WS_GET_FILE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseWsGetFile>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.code == 0)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.code.ToString();
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 获取订单签署短链接
        /// 用于客户查询微签任务的签署短链接，签署人点击短链接进入微签小程序；根据产品编码的配置，已封装支付宝或微信端的跳转；短链接有效时间随产品编码配置的有效时长，具体有效时长请跟微签接口人确认
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WsGetUrl(string partnerID, string checkword, string channelCode, MsgDataRequestWsGetUrl data, string accessToken = "", string environment = "sfapi")
        {
            /*
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WS_GET_URL
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WS_GET_URL）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)	是	渠道编码
            2.4 请求参数<msgData> /OrderCommonRequest
            序号	参数列表	类型	是否必传	含义
            1	taskNo	String	否	微签订单号，二选一，都传以微签订单号为准
            2	businessId	String	否	客户订单号，二选一，都传以微签订单号为准
            2.7 请求示例\应用场景(JSON)示例
            请求报文:

            {
              "taskNo": "WS221117063541",
              "businessId": "SF100000000000",
            }
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表 示接口层的请求果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object	否	处理结果
            2.6.1响应参数<data> / object 
            #	属性名	类型(约束)	必填	描述
            1	shortUrl	String	是	签署短链接
            2	expiresTime	Long	是	有效截止时间戳（秒）
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "code":0,
                "message":"成功",
                "data":{
                    "shortUrl":"https://wxaurl.cn/PezqUNvCFKf"
                    "expiresTime":1668768520
                },
                "requestId":"sdaff128128981229snfa"
            }
            失败报文-范例1
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "sdaff128128981229snfa"
            }
            失败报文-范例2
            {
                "requestId": "bab3debf82ae496",
                "code": 50017,
                "message": "任务已终结,无法继续操作",
                "data": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WS_GET_URL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseWsGetUrl>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.code == 0)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.code.ToString();
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 获取订单签署二维码链接
        /// 用于客户查询微签任务的签署二维码，签署人扫描二维码进入微签小程序；根据产品编码的配置，已封装支付宝或微信端的跳转；二维码有效时间随产品编码配置的有效时长，具体有效时长请跟微签接口人确认
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WsGetQrUrl(string partnerID, string checkword, string channelCode, MsgDataRequestWsGetQrUrl data, string accessToken = "", string environment = "sfapi")
        {
            /*
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WS_GET_QR_URL
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WS_GET_QR_URL）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)	是	渠道编码
            2.4 请求参数<msgData> /OrderCommonRequest
            序号	参数列表	类型	是否必传	含义
            1	taskNo	String	否	微签订单号，二选一，都传以微签订单号为准
            2	businessId	String	否	客户订单号，二选一，都传以微签订单号为准
            2.7 请求示例\应用场景(JSON)示例
            请求报文:

            {
              "taskNo": "WS221117063541",
              "businessId": "SF100000000000",
            }
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表 示接口层的请求果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object	否	处理结果
            2.6.1响应参数<data> / object 
            #	属性名	类型(约束)	必填	描述
            1	qrUrl	String	是	签署短链接
            2	expiresTime	Long	是	有效截止时间戳（秒）
            3	signApps	String[ ]	是	签署小程序，WECHAT-微信，ALIPAY-支付宝
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "code":0,
                "message":"成功",
                "data":{
                    "qrUrl":""
                    "expiresTime":1668768520,
                    "signApps":["WECHAT"]
                },
                "requestId":"sdaff128128981229snfa"
            }
            失败报文-范例1
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "sdaff128128981229snfa"
            }
            失败报文-范例2
            {
                "requestId": "bab3debf82ae496",
                "code": 50017,
                "message": "任务已终结,无法继续操作",
                "data": null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WS_GET_QR_URL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseWsGetQrUrl>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.code == 0)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.code.ToString();
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 任务状态推送 COM_PUSH_WS_TASK_STATUS
        /// 用于微签订单的任务状态发生变更时，由微签系统主动请求客户系统接口地址，告知订单状态的变更
        /// </summary>
        /// <param name="body">顺丰推送过来的数据</param>
        /// <param name="reqData">顺丰推送过来的数据转换后的实体</param>
        /// <returns></returns>
        public static ResponsePushWsTaskStatus PushWsTaskStatus(string body, out MsgDataRequestPushWsTaskStatus reqData)
        {
            /*
            2.1. 公共参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_PUSH_WS_TASK_STATUS）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.2 请求参数
            #	属性名	类型(约束)	必填	描述
            1	taskNo	String	是	微签订单号
            2	businessId	String	是	客户订单号
            3	taskStatus	String	是	微签任务状态，枚举: NOT_CREATED,CREATED,PROCESSING,COMPLETE,FAIL,CANCEL
            枚举备注: 未创建 已创建 处理中 完成 失败 取消
            4	signInfos	List<SignInfoDTO>	是	签署信息
            5	extraInfo	Object	否	额外信息
            2.2.1 <signInfos> / List<SignInfoDTO>  
            #	属性名	类型(约束)	必填	默认值	描述
            1	name	String	是		个人用户姓名
            2	signSeq	String	是		签署顺序
            3	signStatus	String	是		签署状态，枚举: DRAFT ,SIGNING ,COMPLETE ,REVOKE
            枚举备注: 待签署 签署中 完成 撤销
            4	remark	String	否		描述信息
            2.2.2 extraInfo /Object
            #	属性名	类型(约束)	必填	默认值	描述
            1	additionalTasks	List<AdditionalTask>	否		附加任务
            2.2.2 .1 additionalTasks/List<AdditionalTask>
            #	属性名	类型(约束)	必填	默认值	描述
            1	type	string	否		扩展任务类型 INVENTORY–明细清点 BRIEF_INVENTORY–整箱清点
            2	seq	string	否		扩展任务执行顺序:BEFORE_SIGN,AFTER_SIGN
            3	status	string	否		状态:INIT–待清点,PROCESSING–清点中,COMPLETE–清点完成
            4	hasDiff	boolean	否		是否包含异常
            5	errorItems	List<Item>	否		异常内容
            2.2.2 .1.1 errorItems/List<Item>

            #	属性名	类型(约束)	必填	默认值	描述
            1	content	Map	否		内容map
            2.4 请求示例\应用场景(JSON)示例
            请求报文:

            {
                "taskNo":"WS221117063541",
                "businessId":"SF100000000000",
                "taskStatus":"CREATING",
                "signInfos":[
                    {
                        "name":"张三",
                        "signSeq":1,
                        "signStatus":"COMPLETE",
                        "remark":""
                    },
                    {
                        "name":"李四",
                        "signSeq":2,
                        "signStatus":"SIGNING",
                        "remark":""
                    }
                ],
                "extraInfo":null
            }
            2.3 响应参数
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	指定为0，表示接收成功，其他认为接收失败，会重推三次
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "code": 0
            }
            失败报文-自定义
            {
                "code": 100001,
            }
             */
            int code = -1;
            if (!string.IsNullOrEmpty(body))
            {
                var request = JsonHelper.DeserializeObject<PushWsTaskStatusRequest>(body);
                if (request != null)
                {
                    reqData = JsonHelper.DeserializeObject<MsgDataRequestPushWsTaskStatus>(request.msgData);
                    code = 0;
                }
                else
                {
                    reqData = null;
                }
            }
            else
            {
                reqData = null;
            }
            return new ResponsePushWsTaskStatus()
            {
                code = code
            };
        }

        /// <summary>
        /// 下单状态推送 COM_PUSH_WS_ORDER_STATUS
        /// 用于微签订单的下单状态发生变更（成功或失败）时，由微签系统主动请求客户系统接口地址，告知下单状态的变更
        /// </summary>
        /// <param name="body">顺丰推送过来的数据</param>
        /// <param name="reqData">顺丰推送过来的数据转换后的实体</param>
        /// <returns></returns>
        public static ResponsePushWsOrderStatus PushWsOrderStatus(string body, out MsgDataRequestPushWsOrderStatus reqData)
        {
            /*
            2.1. 公共参数
            名称	值
            接口服务代码	COM_PUSH_WS_ORDER_STATUS
            批量交易	不支持
            接口类型	推送
            请求方法	POST
            报文类型	JSON
            2.2 请求参数
            #	属性名	类型(约束)	必填	描述
            1	taskNo	String	是	微签订单号
            2	businessId	String	是	客户订单号
            3	status	String	是	微签下单状态，枚举: ORDER_CREATED ,ORDER_CREATING ,ORDER_CREATION_FAIL
            枚举备注: 下单成功 下单创建中 下单失败
            4	success	Boolean	是	查询结果：true 成功, false 失败
            5	errorMessage	String	否	失败信息，status为ORDER_CREATION_FAIL必填
            6	errorCode	Integer	否	错误状态码
            2.4 请求示例\应用场景(JSON)示例
            请求报文:

            {
              "taskNo": "WS221117063541",
              "businessId": "SF100000000000",
              "status": "ORDER_CREATED",
              "errorMessage" :"",
              "errorCode":null
            }
            2.3 响应参数 
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	指定为0，表示接收成功，其他认为接收失败，会重推三次
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
              "code": 0
            }
            失败报文-自定义
            {
	            "code": 100001,
            }
            */
            int code = -1;
            if (!string.IsNullOrEmpty(body))
            {
                var request = JsonHelper.DeserializeObject<PushWsOrderStatusRequest>(body);
                if (request != null)
                {
                    reqData = JsonHelper.DeserializeObject<MsgDataRequestPushWsOrderStatus>(request.msgData);
                    code = 0;
                }
                else
                {
                    reqData = null;
                }
            }
            else
            {
                reqData = null;
            }
            return new ResponsePushWsOrderStatus()
            {
                code = code
            };
        }

        /// <summary>
        /// 同步改单接口
        /// 用于客户在下单后请求微签修改订单信息，此接口是同步返回；可修改的任务状态：已创建
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WsModify(string partnerID, string checkword, string channelCode, MsgDataRequestWsModify data, string accessToken = "", string environment = "sfapi")
        {
            /*
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WS_MODIFY
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WS_MODIFY）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)	是	渠道编码
            2.4 请求参数<msgData> /OrderModifyRequest
            序号	参数列表	类型	是否必传	含义
            1	businessId	String	是	客户订单号，二选一，都传以微签订单号为准
            2	taskNo	String	是	微签订单号，二选一，都传以微签订单号为准
            3	operator	String	否	操作人
            4	orderModifyInfo	Object	是	需要修改的订单参数
            2.4.1请求参数<orderModifyInfo> /Object
            序号	参数列表	类型	是否必传	含义
            1	taskSigners	List<SignerInfoVO>	是	任务签署人信息，客户提供
            2	displayNo	String	否	展示单号，客户提供，签署小程序展示的单号
            3	fileCode	String	否	文件编码，文件传输方式使用
            4	taskExtra	TaskExtraInfo	否	额外属性，模板方式使用
            5	signRule	SignRule	否	
            2.4.1.1请求参数<taskSigners>/List<SignerInfoVO>
            序号	参数列表	类型	是否必传	含义
            1	psnInfo	PsnInfoVO	否	签署人信息，签署方类型为PERSON传该对象
            2	orgInfo	OrgInfoVO	否	机构信息，企业签署 必传，签署方类型为ORG传该对象
            3	signAreas	List<SignArea>	否	签署区域
            2.4.1.1.1请求参数<psnInfo>/PsnInfoVO
            序号	参数列表	类型	是否必传	含义
            1	name	String	否	个人用户姓名
            2	idNumber	String	否	个人证件号
            3	mobileNo	String	否	手机号
            2.4.1.1.1请求参数<orgInfo>/OrgInfoVO
            序号	参数列表	类型	是否必传	含义
            1	sealId	String	否	印章id，客户提供，签署机构生成的印章id
            2	orgCode	String	否	企业编码，微签提供，微签依据企业生成的唯一企业编码
            3	orgName	String	否	企业名称，与企业编码二选一
            4	transactorInfo	PsnInfoVO	否	经办人信息
            2.4.1.2请求参数signAreas/List<SignArea>
            序号	参数列表	类型	是否必传	含义
            1	signFieldType	String	否	组件类型，SIGN 普通签署区，REMARK 备注区域，不传此参数默认为 普通签署区
            2	signFieldConfig	SignFieldConfig	否	签章区配置项（当signFieldType为 SIGN 时，该参数为必传）
            3	remarkFieldConfig	RemarkFieldConfig	否	备注区配置项（当signFieldType为 REMARK 时，该参数为必传）
            2.4.1.2.1请求参数signFieldConfig/SignFieldConfig
            序号	参数列表	类型	是否必传	含义
            1	calcPosConfig	CalcPosConfig	否	坐标计算
            2	dateFormat	SignFieldConfig	否	签署日期类型，YYYYMMDD1（yyyy年MM月dd日），YYYYMMDD2（yyyy-MM-dd），YYYYMMDD13（yyyy/MM/dd）
            3	position	Position	否	签署区位置
            2.4.1.2.2.1请求参数calcPosConfig/CalcPosConfig
            序号	参数列表	类型	是否必传	含义
            1	calcPage	String	否	坐标使用的页码，LAST_PAGE（最后一页），SPECI_PAGE（指定页码）
            2	calcPosType	String	否	计算坐标类型，BOTTOM_LEFT（左下角），TOP_LEFT（左上角），BOTTOM_RIGHT（右下角），TOP_RIGHT（右上角），FREE_POS（自定义坐标）
            2.4.1.2.2.2请求参数position/Position
            序号	参数列表	类型	是否必传	含义
            1	pageNum	Integer	否	页码
            2	positionX	Integer	否	坐标X，左下角为原点，签署区为区域位置为中心点，备注区为区域左下角
            3	positionY	Integer	否	坐标Y，左下角为原点，签署区为区域位置为中心点，备注区为区域左下角
            2.4.1.1.1.1请求参数remarkFieldConfig/RemarkFieldConfig
            序号	参数列表	类型	是否必传	含义
            1	remarkFontSize	Integer	否	备注文字字号，默认给12
            2	signFieldHeight	Integer	是	备注签署区的高度
            3	signFieldWidth	Integer	是	备注签署区的宽度
            4	calcPosConfig	Integer	否	坐标计算
            5	position	Position	否	签署区位置
            2.4.2请求参数taskExtra/TaskExtraInfo
            序号	参数列表	类型	是否必传	含义
            1	componentFields	ComponentField	否	模板字段信息，微签提供字段，客户传字段key 对应的value值
            2	additionalTasks	List<AdditionalTask>	否	附加任务
            2.4.2.1请求参数componentFields/List<ComponentField>
            序号	参数列表	类型	是否必传	含义
            1	key	String	否	控件Key（设置合同文件模板时由用户自定义）
            2	value	Object	否	控件值（用户下单填充）
            2.4.1.2.2 additionalTasks/List<AdditionalTask>
            #	属性名	类型(约束)	必填	默认值	描述
            1	type	string	否		扩展任务类型 INVENTORY–明细清点 BRIEF_INVENTORY–整箱清点
            2	seq	string	否		扩展任务执行顺序:BEFORE_SIGN,AFTER_SIGN
            5	items	List<Item>	否		清点内容
            2.4.1.2.2.1 items/List<Item>

            #	属性名	类型(约束)	必填	默认值	描述
            1	tabSeq	int	否		列表排序
            2	content	Map	否		内容map
            2.4.3请求参数signRule/SignRule
            序号	参数列表	类型	是否必传	含义
            1	partyType	String	否	签署人类型：SPECI_NAME（指定姓名），ALL_NM（任意自然人），SPECI_NM（指定自然人），不传取产品默认
            2.7 请求示例\应用场景(JSON)示例
            请求报文：

            {
                "businessId": "SF100000000000",
                "taskNo": "WS221117063541",
                "orderModifyInfo": {
                    "displayNo": "",
                    "signRule": {
                        "partyType": "ALL_NM"
                    },
                    "fileCode": "FL...",
                    "taskSigners": [
                        {
                            "psnInfo": {
                                "name": "张三",
                                "idNumber": "610623199810150715",
                                "mobileNo": "17629262541"
                            },
                            "signAreas": [
                                {
                                    "signFieldType": "SIGN",
                                    "signFieldConfig": {
                                        "dateFormat": "YYYYMMDD1",
                                        "position": {
                                            "pageNum": 1,
                                            "positionX": 80,
                                            "positionY": 80
                                        }
                                    }
                                },
                                {
                                    "signFieldType": "REMARK",
                                    "remarkFieldConfig": {
                                        "signFieldHeight": 100,
                                        "signFieldWidth": 200,
                                        "position": {
                                            "pageNum": 1,
                                            "positionX": 0,
                                            "positionY": 0
                                        }
                                    }
                                }
                            ]
                        }
                    ]
                }
            }
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表 示接口层的请求果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object	否	处理结果
            2.6.1响应参数<data> / object
            #	属性名	类型(约束)	必填	描述
            1	taskNo	String	是	微签订单号
            2	businessId	String	是	客户订单号
            3	success	Boolean	是	改单结果：true 成功, false 失败
            4	errorMessage	String	是	改单失败原因描 述，success为false 时必填
            5	errorCode	Integer	是	错误状态码
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应
            {
              "code": 0,
              "message": "成功",
              "data": null,
              "requestId": "826221e7a7dd492"
            }
            失败报文-范例
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "826221e7a7dd492"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WS_MODIFY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseWsModify>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        if (msgDataResponse.code == 0)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.code.ToString();
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 短信发送接口
        /// 用于客户请求微签发送签署短信给签署人，以订单维度限制短信发送数量：10条/天；短信签署链接有效时间随产品编码配置的有效时长，具体有效时长请跟微签接口人确认
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WsSmsSend(string partnerID, string checkword, string channelCode, MsgDataRequestWsSmsSend data, string accessToken = "", string environment = "sfapi")
        {
            /*
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WS_SMS_SEND
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WS_SMS_SEND）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)	是	渠道编码
            2.4 请求参数<msgData> /OrderSmsRequest
            序号	参数列表	类型	是否必传	含义
            1	businessId	String	是	客户订单号，二选一，都传以微签订单号为准
            2	taskNo	String	是	微签订单号，二选一，都传以微签订单号为准
            3	operator	string	是	操作人
            2.7 请求示例\应用场景(JSON)示例
            请求报文：

            {
              "operator": "zhangsan",
              "taskNo": "WS221117063541",
              "businessId": ""
            }
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表 示接口层的请求果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object	否	处理结果
            2.6.1响应参数<data> / object
            #	属性名	类型(约束)	必填	描述
            3	success	Boolean	是	发送短信结果：true 成功, false 失败
            5	reason	String	是	失败原因
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应
            {
              "code": 0,
              "message": "成功",
              "data": 
               {
              "success": true,
              "reason": null
               }
              "requestId": "826221e7a7dd492"
            }
            失败报文-范例1
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "826221e7a7dd492"
            }
            失败报文-范例2
            {
                "requestId": "b0600861b5ff4db",
                "code": 0,
                "message": "成功",
                "data": {
                    "success": false,
                    "reason": "当前订单超过发送短信数量限制"
                }
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WS_SMS_SEND";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseWsSmsSend>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.code == 0)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.code.ToString();
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 上传待签署文件
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)</param>
        /// <param name="fileData">上传文件流（二进制字节流）</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WsGetFileUploadUrl(string partnerID, string checkword, string channelCode, byte[] fileData, MsgDataRequestWsGetFileUploadUrl data, string accessToken = "", string environment = "sfapi")
        {
            /*
            上传文件到微签服务端时，分为两个步骤：
            获取文件上传地址
            上传文件流（二进制字节流）
            */

            /*
            一、获取文件上传地址
            1. 功能描述
            获取文件的上传地址后，上传文件流，使得将待签署文件传输到微签服务端；

            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WS_GET_FILE_UPLOAD_URL
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_EPS_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)	是	渠道编码
            2.4 请求参数<msgData>
            序号	参数列表	类型	是否必传	含义
            1	fileMd5	String	是	文件MD5
            2	fileName	String	是	文件名称（必须带上文件扩展名，示例：合同.pdf），不可包含特殊字符
            注意：
            （1）该字段的文件后缀名称和真实的文件后缀需要一致。比如上传的文件类型是word文件，那该参数需要传“xxx.docx”，不能是“xxx.pdf”；
            （2）文件名称不可以含有特殊字符：例如：/ \ : * " < > | ？以及所有emoji表情等；
            （3）文件支持类型：pdf、doc、docx、xls、xlsx、ppt、pptx、jpg、jpeg、png
            3	fileSize	String	是	文件大小，单位byte，上传的文件总大小要求不超过20971520（20MB）
            2.7 请求示例\应用场景(JSON)示例
            文件MD5计算方法

            //计算字符串的Content-MD5
            //@param str 文件路径
            // @return
            public static String getStringContentMD5(String str)
            {
                // 获取文件MD5的二进制数组（128位）
                byte[] bytes = getFileMD5Bytes1282(str);
                // 对文件MD5的二进制数组进行base64编码
                return new String(Base64.encodeBase64(bytes));
            }
            // 获取文件MD5-二进制数组（128位）
            // @param filePath
            //@return
            // @throws IOException
            public static byte[] getFileMD5Bytes1282(String filePath)
            {
                FileInputStream fis = null;
                byte[] md5Bytes = null;
                try
                {
                    File file = new File(filePath);
                    fis = new FileInputStream(file);
                    MessageDigest md5 = MessageDigest.getInstance("MD5");
                    byte[] buffer = new byte[1024];
                    int length = -1;
                    while ((length = fis.read(buffer, 0, 1024)) != -1)
                    {
                        md5.update(buffer, 0, length);
                    }
                    md5Bytes = md5.digest();
                    fis.close();
                }
                catch (FileNotFoundException e)
                {
                    System.out.println(e.getMessage());
                    e.printStackTrace();
                }
                catch (NoSuchAlgorithmException e)
                {
                    System.out.println(e.getMessage());
                    e.printStackTrace();
                }
                catch (IOException e)
                {
                    System.out.println(e.getMessage());
                    e.printStackTrace();
                }
                return md5Bytes;
            }
            请求报文：

            {
              "fileMd5": "vzuZkj7srlJPJ0GvgbbDwg==",
              "fileName": "test.pdf",
              "fileSize": 1024
            }
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表示接口层的请求果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object	否	处理结果
            2.6.1响应参数<data> / object
            #	属性名	类型(约束)	必填	描述
            1	exist	Boolean	是	文件是否存在：如果存在，则不返回上传地址，可直接使用文件编码；如果不存在，则需要使用链接上传文件后方可使用
            2	fileCode	String	是	文件编码
            3	uploadUrl	String	是	文件上传地址，链接有效期30分钟。
            4	expiresIn	Integer	是	链接有效时长（秒）
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应
            {
              "requestId": "10e14e2c30724d3",
              "code": 0,
              "message": "成功",
              "data": {
                "exist": false,
                "fileCode": "FL23042400002508",
                "uploadUrl": "https://.....",
                "expiresIn": 1800
              }
            }
            失败报文 - 范例1
            {
              "requestId": "bdd4b5d117a84a7",
              "code": 710004,
              "message": "文件不是指定类型,请检查",
              "data": null
            }
            失败报文 - 范例2
            {
              "requestId": "628161b124ab432",
              "code": 710001,
              "message": "文件超出规定大小",
              "data": null
            } 
            */

            /*
            二、文件流上传文件

            1.功能描述
            第一步在获取文件的上传地址后，然后根据链接上传文件至微签；

            2.1.公共参数

            上传地址：步骤1 获取文件上传地址 中所获取到的 uploadUrl

            名称 值
            请求方法 PUT
            报文类型 进制字节流
            2.2.请求头Headers
            序号 参数名称    参数值 示例  是否必传 含义
            1   Content - MD5 String与【步骤1 获取文件上传地址】Body体中contentMd5值一致
            ** 注意：**必须跟上述说明接口的contentMd5参数一致，否则会异常 是   文件MD5
            2.3 请求参数<msgData>

            待上传文件的二进制字节流（注意：此文件必须与contentMd5值对应的文件一致）

            2.4 响应参数

            根据HTTP状态判断，200为成功，否则失败（失败返回为XML格式）

            2.7 Postman请求示例

            image20230310193644437.png

            image20230310193707637.png

            失败示例

            image20230310193856487.png

            <? xml version = '1.0' encoding = 'utf-8' ?>
            < Error >
                < Code > AccessDenied </ Code >
                < Message > Request has expired </ Message >
                < ServerTime > 2023 - 03 - 10T11: 38:18Z </ ServerTime >
                < Resource >/ wesign / files / 2023 / 03 / 10 / 222 / FL23031000011505.pdf </ Resource >
                < RequestId > NjQwYjE2YWFfNmYxMzc2MGJfMTc4YmJfYTQxYWIxOA ==</ RequestId >
                < TraceId > OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc0OWRkZjk0ZDM1NmI1M2E2MTRlY2MzZDhmNmI5MWI1OTQyYWVlY2QwZTk2MDVmZDQ3MmI2Y2I4ZmI5ZmM4ODFjNWUxMmVmMDg0MjBiYzY2N2E1ZWU5NDEyNzE5YjliNzg =</ TraceId >
            </ Error >
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WS_GET_FILE_UPLOAD_URL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            Dictionary<string, string> header = new Dictionary<string, string>();
            header.Add("Channel-Code", channelCode);

            var result = HttpHelper.GetResponseSgspdcs(content, header, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseWsGetFileUploadUrl>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.code == 0)
                        {
                            Dictionary<string, string> headerPut = new Dictionary<string, string>();
                            headerPut.Add("Content-MD5", FileHelper.GetMD5(fileData));
                            string uploadUrl = msgDataResponse.data.uploadUrl;
                            var isUpload = HttpHelper.HttpPut(uploadUrl, fileData, headerPut);
                            if (isUpload)
                            {
                                errcode = "0";
                            }
                            else
                            {
                                errcode = "-3";
                                resultdata = "上传待签署文件，文件流推送失败！";
                            }
                        }
                        else
                        {
                            errcode = msgDataResponse.code.ToString();
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        resultdata = "返回的apiResultData为null！";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                resultdata = "返回的内容为null！";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 批量创建资源
        /// 用于向微签（电子回单）创建资源，可提前进行参数的校验，下单时可使用资源进行下单。批量创建的最大限制为20
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="channelCode">渠道编码 MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)</param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult WsCreateResource(string partnerID, string checkword, string channelCode, MsgDataRequestWsCreateResource data, string accessToken = "", string environment = "sfapi")
        {
            /*
            1. 功能描述
            用于向微签（电子回单）创建资源，可提前进行参数的校验，下单时可使用资源进行下单。批量创建的最大限制为20

            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_WS_CREATE_RESOURCE
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	支持
            接口类型	接入
            请求方法	POST
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_WS_CREATE_RESOURCE）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填 签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填 获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求头Headers
            序号	参数名称	参数值	示例	是否必传	含义
            1	Channel-Code	String	MCS-CAS-API-BOX(沙箱环境专用，正式环境联系微签接口人提供)	是	渠道编码
            2.4 请求参数<msgData> /OrderCreateRequest
            序号	参数列表	类型	是否必传	含义
            1	productCode	String	是	产品编码，微签提供
            2	createUser	String	是	订单创建人，客户提供，仅留存使用
            3	taskOrderInfos	List<TaskOrderInfoVO>	是	资源信息
            2.4.1请求参数<taskOrderInfos> /List<TaskOrderInfoVO>
            序号	参数列表	类型	是否必传	含义
            1	taskSigners	List<SignerInfoVO>	是	任务签署人信息，客户提供
            2	businessId	String	是	客户订单号，客户提供，识别订单的标识，同一商户订单号 不能重复下单
            3	displayNo	String	否	展示单号，客户提供，签署小程序展示的单号，不传默认businessId
            4	fileCode	String	否	文件编码
            5	taskExtra	TaskExtraInfo	否	额外属性
            2.4.1.1请求参数<taskSigners>/List<SignerInfoVO>
            序号	参数列表	类型	是否必传	含义
            1	signerType	String	是	签署方类型，**枚举:**PERSON ,ORG，枚举备注: 个人 机构
            2	signSeq	Integer	否	签署顺序，多人签署必传，从1开始，按顺序签署
            3	psnInfo	PsnInfoVO	否	签署人信息，签署方类型为PERSON传该对象
            4	orgInfo	OrgInfoVO	否	机构信息，企业签署 必传，签署方类型为ORG传该对象
            2.4.1.1.1请求参数<psnInfo>/PsnInfoVO
            序号	参数列表	类型	是否必传	含义
            1	name	String	否	个人用户姓名
            2	idNumber	String	否	个人证件号
            3	mobileNo	String	否	手机号
            2.4.1.1.2请求参数<orgInfo>/OrgInfoVO
            序号	参数列表	类型	是否必传	含义
            1	sealId	String	否	印章id，客户提供，签署机构生成的印章id
            2	orgCode	String	否	企业编码，微签提供，微签依据企业生成的唯一企业编码
            3	transactorInfo	PsnInfoVO	否	经办人信息
            2.4.1.2请求参数<taskExtra>/TaskExtraInfo
            序号	参数列表	类型	是否必传	含义
            1	componentFields	ComponentField	否	模板字段信息，微签提供字段，客户传字段key 对应的value值
            2.4.1.2.1请求参数<componentFields>/ComponentField
            序号	参数列表	类型	是否必传	含义
            1	key	String	否	控件Key（设置合同文件模板时由用户自定义）
            2	value	Object	否	控件值（用户下单填充）
            2.7 请求示例\应用场景(JSON)示例
            请求报文：

            示例1，文件上传方式，单个签署
            {
                "createUser": "234",
                "productCode": "PRO230207001087",
                "taskOrderInfos": [
                    {
                        "businessId": "SF123456789632",
                        "displayNo":"SF4000005855107",
                        "fileCode":"FL23012900002207",
                        "taskSigners": [
                            {
                                "psnInfo": {
                                        "name": "李雷",
                                        "idNumber": "11010119900307133X",
                                        "mobileNo": "13800001111"
                                },
                                "signerType": "PERSON",
                                "signSeq": 1
                            }
                        ]
                    }
                ]
            }
            示例2，模板传输方式，会签
            {
                "createUser": "234",
                "productCode": "PRO221230001263",
                "taskOrderInfos": [
                    {
                        "businessId": "SF123456789123",
                        "taskExtra": {
                            "componentFields": [
                                {
                                    "key": "Origin",
                                    "value": "广东省深圳市南山区深投控创智天地大厦"
                                }
                            ]
                        },
                        "taskSigners": [
                            {
                                "psnInfo":                    
                 {
                        
                                    "idNumber": "110101199003074610",
                                    "mobileNo": "18455556666",
                                    "name": "韩梅梅"
                                    },
                                "signerType": "PERSON",
                                "signSeq": 2
                            },
                            {
                                "orgInfo": {
                                    "sealId": "6e3bca25-e239-4346-b395-0a669145dd8c",
                                    "orgCode": "ORG23423411",
                                    "transactorInfo": {

                                        "name": "李雷",
                                        "idNumber": "11010119900307133X",
                                        "mobileNo": "13800001111"
                                } 
                                },
                                "signerType": "ORG",
                                "signSeq": 1
                            }
                        ]
                    }
                ]
            }
            2.5 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String	是		API平台结果代码
            2	apiErrorMsg	String	否		API平台异常信息
            3	apiResponseID	String	是		API响应唯一标识UUID
            4	apiResultData	Object	否		业务数据报文
            2.6 响应参数<apiResultData> / Result
            #	属性名	类型(约束)	必填	描述
            1	code	Integer	是	此字段是通信标识，表 示接口层的请求果，“0”-成功,其他为失败
            2	message	String	是	code为"0"时，返回 “成功”，非"0"时返回其他错误信息
            3	requestId	String	否	请求标识
            4	data	Object[]	否	处理结果
            2.6.1响应参数<data> / object[]
            #	属性名	类型(约束)	必填	描述
            1	taskNo	String	是	微签订单号
            2	businessId	String	是	客户订单号
            3	success	Boolean	是	预下单结果：true 成功, false 失败
            4	errorMessage	String	是	下单失败原因描 述，success为false 时必填
            5	errorCode	Integer	是	错误状态码
            2.8 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应
            {
              "code": 0,
              "message": "成功",
              "data": [
                {
                  "resourceCode": "RES23042400002324",
                  "businessId": "SF100000000000",
                  "success": true,
                  "errorMessage": null,
                  "errorCode":null
                }
              ],
              "requestId": "826221e7a7dd492"
            }
            失败报文-范例1
            {
	            "code": 100001,
	            "data": null,
	            "message": "请求参数异常",
	            "requestId": "826221e7a7dd492"
            }
            失败报文-范例2
            {
                "requestId": "826221e7a7dd492",
                "code": 0,
                "message": "成功",
                "data": [
                    {
                        "success": false,
                        "errorMessage": "商户订单号已存在，请勿重复下单",
                        "errorCode": 80013,
                        "businessId": "sd11asddas"
                    }
                ]
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_WS_CREATE_RESOURCE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseWsCreateResource>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.message;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.code == 0)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.code.ToString();
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        resultdata = "返回的apiResultData为null！";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                resultdata = "返回的内容为null！";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 微签服务类接口

        #region 顺易销进销存服务类接口

        #endregion 顺易销进销存服务类接口

        #region 其他

        /// <summary>
        /// 港区自助柜逆向查运单 
        /// 1. 接口简介
        /// 本API目的提供已使用香港顺丰自助柜退件下单API接口服务的顺丰各大客户查询退件订单对应的运单號。本API提供中英对照资料，支援客户需要。
        /// 功能描述
        /// 香港顺丰自助柜退件查询运单號接口根据客户需要，可提供以下功能
        /// 按成功下单的订单號查询对应运单號
        /// 路由轨跡（可选）
        /// 注：如欲使用此服务，请先向负责销售同事提出请求確认对接方案后再按此文档进行开发。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult LockerReturnSearchOrder(string partnerID, string checkword, MsgDataRequestLockerReturnSearchOrder data, string accessToken = "", string environment = "sfapi-hk")
        {
            /*
            2.3. 请求参数<msgData>
            #	属性名	类型	是否必传	描述
            1	sendId	String(64)	是	订单號，下单时顺丰返回
            2.4. 公共响应参数
            #	属性名	类型	是否必传	描述
            1	success	String	是	true 请求成功，false 请求失败
            2	errorCode	String	是	错误编码，成功不显示
            3	errorMessageZh	String	是	错误描述繁体中文
            4	errorMessageCn	String	是	错误描述简体中文
            5	errorMessageEn	String	是	错误描述英文
            6	obj	list	是	返回的详细数据
            2.5. 响应参数<obj>
            #	属性名	类型	是否必传	描述
            1	waybillType	String（64）	是	运单号类型 1：母单 2 :子单 3 : 签回单
            2	waybillNo	String（10）	是	运单号
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
            “sendId”: “P202402051189470”
            }

            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:

            {
            “success”: true,
            “errorCode”: “”,
            “errorMessageZh”: “”,
            “errorMessageCn”: “”,
            “errorMessageEn”: “”,
            “obj”: [{
            " waybillNo": “SF1234567890123”,
            " waybillType": “1”
            }]

            }

            失败响应：

            {
            “success”: false,
            “errorCode”: “6150”,
            " errorMessageZh ": “找不到该订单”,
            “errorMessageCn”: “”,
            “errorMessageEn”: " ",
            “obj”: null
            }

            3. 错误代码
            3.1. （API）平台结果代码列表
            标识	说明	解决方法
            A1000	统一接入平台校验成功，调用后端服务成功; 注意：不代表后端业务处理成功，实际业务处理结果，需要查看响应属性apiResultData中的详细结果	表示接口调用正常
            A1001	必传参数不可为空	请做以下几点检查：1、参数列表必传字段未填写 2、请求报文头，未配置Content-type：application/x-www-form-urlencoded 3、参数key存在空格问题 4、http请求参数都通过http URL编码传送 5、业务数据报文（msgData）为json报文数据格式 6、接口整体报文为form表单
            A1011	OAuth2认证失败	使用OAuth2认证会产生该提示请检查业务接口的accessToken参数是否超过2小时，2小时口令会更新，请调用OAuth2认证接口重新获取
            A1003	IP无效	顾客编码（partnerID）配置了需校验IP，请解除校验或按绑定IP调用接口
            A1004	无对应服务权限	可能存在的原因：1、顾客编码（partnerID）没有配置（关联）对应接口的业务接口，请在【开发者对接】-【API列表】中关联；2、接口请求数据与实际环境不一致，请先查看【开发者对接】-【API列表】接口状态： a、【测试中】请使用沙箱环境 b、【已上线】请使用正式环境；3、后台配置没有生效，可等待2分钟后在试试，如果还是无法操作，请报障人工处理
            A1005	流量受控	丰桥为接口功能联调环境，接口整体都有限流管控，单客户编码对应的每个接口限流规则：1、单接口调用30次/s 2、单接口调用3000次/天请尽量只操作功能联调，切勿进行接口压测，谢谢！
            A1006	数字签名无效	请做以下几点检查：1、确认checkword是否配置正确 2、确认verifyCode、msgDigest是否加密加签正确 3、确认参数是否有特殊字符，如：& 4、参数整体式form表单格式 5、非java类语言，需注意特殊字符，目前支持的特殊字符“*”，“空格”，“-”请优先使用 6、如果数字签名操作不便，可改为OAuth2认证，Token交互即可，具体参见【开发规范】【鉴权方式说明】
            A1008	数据解密失败	在特殊场景中使用，如有出现请报障人工处理
            A1009	目标服务异常或不可达	接口下游服务异常，如有出现请报障人工处理
            A1010	状态为沙箱测试	该问题在老客户中会有此类问题，新客户不会出现，如有出现请报障人工处理
            A1099	系统异常	接口服务异常，如有出现请报障人工处理
            3.2. 业务异常代码
            错误代码	错误中文描述	错误中文描述	Description	处理建议
            9999	系统异常,请稍后再试	系统异常，请稍后再试	System error, please try again later.	系统异常,请稍后再试
            8018	订单號不能为空	订单號不能为空	Order number is required.	sendId不能为空
            6150	找不到该订单	找不到该订单	The order cannot be found.	确认订单号sendId是否传错
            8037	订单已消单	订单已消单	The order is cancelled	订单已被取消
            */
            string errcode = "";
            string errmsgZh = "";
            string errmsgCn = "";
            string errmsgEn = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_LOCKER_RETURN_SEARCH_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseLockerReturnSearchOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsgZh = msgDataResponse.errorMessageZh;
                        errmsgCn = msgDataResponse.errorMessageCn;
                        errmsgEn = msgDataResponse.errorMessageEn;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsgCn = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsgCn,
                data = resultdata
            };
        }

        /// <summary>
        /// 港区自助柜逆向下单  COM_RECE_LOCKER_RETURN_CREATE_ORDER
        /// 1. 接口简介
        /// 本API目的提供已使用香港顺丰自助柜退件下单API接口服务的顺丰各大客户查询退件订单对应的运单號。本API提供中英对照资料，支援客户需要。
        /// 功能描述
        /// 香港顺丰自助柜退件下单接口根据客户需要，可提供以下功能
        /// 客户系统向顺丰下发柜退订单
        /// 为订单分配寄件码及订单號
        /// 路由轨跡（可选）
        /// 注：如欲使用此服务，请先向负责销售同事提出请求確认对接方案后再按此文档进行开发。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult LockerReturnCreateOrder(string partnerID, string checkword, MsgDataRequestLockerReturnCreateOrder data, string accessToken = "", string environment = "sfapi-hk")
        {
            /*
            2. API 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_LOCKER_RETURN_CREATE_ORDER
            香港生产环境	https://sfapi-hk.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            #	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填，不可与accessToken字段同时传参签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填，不可与msgDigest同时传参获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            #	属性名	类型	是否必传	描述
            1	expressProduct	String(4)	是	输入1003:自助柜退件
            2	receiverProvinceName	String(30)	是	填写区號，如大埔区、观塘区、葵青区等
            3	receiverCityName	String(100)	是	填写地区，如大埔、九龙湾、青衣等
            4	receiverCountryName	String(30)	是	国家或地区代码 例如：内地件CN 香港852 参照附录《城市代码表》[需要注入超链接：https://open.sf-express.com/developSupport/734349?activeIndex=571489]
            5	receiverAddressDetail	String(200)	是	填写详细地址，如香港葵青区青衣航运路36號亚洲物流大厦9楼
            6	receiverContact	String(20)	是	收件人电话
            7	receiverName	String(100)	是	收件人姓名
            8	senderProvinceName	String(30)	是	填写区號，如大埔区、观塘区、葵青区等
            9	senderCityName	String(100)	是	填写地区，如大埔、九龙湾、青衣等
            10	senderCountryName	String(30)	是	输入HK
            11	senderAddressDetail	String(200)	是	填写详细地址，如香港葵青区青衣航运路36號亚洲物流大厦9楼
            12	senderName	String(100)	是	寄件人姓名
            13	senderContact	String(20)	是	寄件人电话
            14	expressTypeId	String(5)	是	快件产品类别，自助柜退件填写258-退换自寄
            15	goodsNum	Number(5)	是	货物数量
            16	itemType	String(128)	是	托寄物类型描述,如： 文件，电子产品，衣服等
            17	payType	Number(2)	是	付款方式，支持以下值： 1:寄付月结 3:到付
            18	monthlyCard	String(20)	是	月结卡号。payType为1时为必填, 月结卡號必须为10位数字
            2.4. 公共响应参数
            #	属性名	类型	是否必传	描述
            1	success	String	是	true 请求成功，false 请求失败
            2	errorCode	String	是	错误编码，成功不显示
            3	errorMessageZh	String	是	错误描述繁体中文
            4	errorMessageCn	String	是	错误描述简体中文
            5	errorMessageEn	String	是	错误描述英文
            6	obj	list	是	返回的详细数据
            2.5. 响应参数<obj>
            #	属性名	类型	是否必传	描述
            1	sendId	String（64）	是	订单號，系统自动生成。使用运单查询接口时採用订单號
            2	sendCode	String（10）	是	寄件码
            2.6. 请求示例\应用场景(JSON)示例
            请求报文:（msgData字段）:

            {
              "expressProduct": "1003", 
              "receiverProvinceName": "852",
              "receiverCityName": "葵青区",
              "receiverCountryName": "HK",
              "receiverAddressDetail": "航运路36號亚洲物流大厦9楼",
              "receiverContact": "99998888",
              "receiverName": "HKIT",
              "senderProvinceName": "852",
              "senderCityName": "大埔区",
              "senderCountryName": "HK",
              "senderAddressDetail": "广福道20號广福大厦1楼",
              "senderName": "Test",
              "senderContact": "88889999",
              "expressTypeId": "258",
              "goodsNum": 2,
              "itemType": "日用品",
              "payType": "1",
              "monthlyCard": "8520000000"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:

            {
                "success": true,
                "errorCode": "",
                "errorMessageZh": "",
                "errorMessageCn": "",
                "errorMessageEn": "",
                "obj": {
                    "sendId": "P202402051189470",
                    "sendCode": "84303953"
                }
            }
            失败响应：

            {
                "success": false,
                "errorCode": "1001",
                " errorMessageZh ": "收件电话不能为空或者不合法",
                "errorMessageCn": "收件电话不能为空或者不合法",
                "errorMessageEn": " Receiver‘s telephone number is required.",
                "obj": null
            }

            3. 错误代码
            3.1. （API）平台结果代码列表
            标识	说明	解决方法
            A1000	统一接入平台校验成功，调用后端服务成功; 注意：不代表后端业务处理成功，实际业务处理结果，需要查看响应属性apiResultData中的详细结果	表示接口调用正常
            A1001	必传参数不可为空	请做以下几点检查：1、参数列表必传字段未填写 2、请求报文头，未配置Content-type：application/x-www-form-urlencoded 3、参数key存在空格问题 4、http请求参数都通过http URL编码传送 5、业务数据报文（msgData）为json报文数据格式 6、接口整体报文为form表单
            A1011	OAuth2认证失败	使用OAuth2认证会产生该提示请检查业务接口的accessToken参数是否超过2小时，2小时口令会更新，请调用OAuth2认证接口重新获取
            A1003	IP无效	顾客编码（partnerID）配置了需校验IP，请解除校验或按绑定IP调用接口
            A1004	无对应服务权限	可能存在的原因：1、顾客编码（partnerID）没有配置（关联）对应接口的业务接口，请在【开发者对接】-【API列表】中关联；2、接口请求数据与实际环境不一致，请先查看【开发者对接】-【API列表】接口状态： a、【测试中】请使用沙箱环境 b、【已上线】请使用正式环境；3、后台配置没有生效，可等待2分钟后在试试，如果还是无法操作，请报障人工处理
            A1005	流量受控	丰桥为接口功能联调环境，接口整体都有限流管控，单客户编码对应的每个接口限流规则：1、单接口调用30次/s 2、单接口调用3000次/天请尽量只操作功能联调，切勿进行接口压测，谢谢！
            A1006	数字签名无效	请做以下几点检查：1、确认checkword是否配置正确 2、确认verifyCode、msgDigest是否加密加签正确 3、确认参数是否有特殊字符，如：& 4、参数整体式form表单格式 5、非java类语言，需注意特殊字符，目前支持的特殊字符“*”，“空格”，“-”请优先使用 6、如果数字签名操作不便，可改为OAuth2认证，Token交互即可，具体参见【开发规范】【鉴权方式说明】
            A1008	数据解密失败	在特殊场景中使用，如有出现请报障人工处理
            A1009	目标服务异常或不可达	接口下游服务异常，如有出现请报障人工处理
            A1010	状态为沙箱测试	该问题在老客户中会有此类问题，新客户不会出现，如有出现请报障人工处理
            A1099	系统异常	接口服务异常，如有出现请报障人工处理
            3.2. 业务异常代码
            错误代码	错误中文描述	错误中文描述	Description	处理建议
            9999	系统异常,请稍后再试	系统异常，请稍后再试	System error, please try again later.	系统异常,请稍后再试
            1001	收件电话不能为空或者不合法	收件电话不能为空或者不合法	Receiver‘s telephone number is required.	receiverContact不能为空
            1002	收件地址不能为空	收件地址不能为空	Receiver‘s address is required.	receiverAddressDetail不能为空
            1003	收件人区號不能为空	收件人区號不能为空	Receiver’s province name is required.	receiverProvinceName不能为空
            1004	收件人地区不能为空	收件人地区不能为空	Receiver’s city name is required.	receiverCityName不能为空
            1005	收件人国家或地区代码不能为空	收件人国家或地区代码不能为空	Receiver’s Country name is required.	receiverCountryName不能为空
            1006	收件联系人不能为空	收件联系人不能为空	Receiver‘s contact name is required.	receiverName不能为空
            1007	寄件地址不能为空	寄件地址不能为空	Shipper‘s address is required.	senderAddressDetail不能为空
            1008	寄件人区號不能为空	寄件人区號不能为空	Shipper‘s province name is required.	senderProvinceName不能为空
            1009	寄件人地区不能为空	寄件人地区不能为空	Shipper‘s city name is required.	senderCityName不能为空
            1010	寄件人国家或地区代码不能为空	寄件人国家或地区代码不能为空	Shipper‘s Country name is required.	senderCountryName不能为空
            1011	寄件联系人不能为空	寄件联系人不能为空	Shipper‘s contract name is required.	senderName不能为空
            1012	寄件电话不能为空	寄件电话不能为空	Shipper‘s telephone number is required.	senderContact不能都为空
            1013	托寄物品名不能为空	托寄物品名不能为空	Commodity name is required.	itemType不能为空
            1014	托寄物数量不能为空	托寄物数量不能为空	Commodity qty is required.	goodsNum不能为空
            1015	付款方式错误	付款方式错误	Incorrect Pay Type	payType不正確
            1016	月结卡號不能为空	月结卡号不能为空	Credit account number is required.	monthlyCard不能为空
            1017	月结卡号不合法	月结卡号不合法	Invalid credit account number.	monthlyCard月结卡號必须为10位数字
            1018	快件产品类别不能为空	快件产品类别不能为空	Express type is required.	expressTypeId不能为空
            1019	服务类別不能为空	服务类别不能为空	Express product is required.	expressProduct不能为空
            1020	服务类別错误	服务类别错误	Incorrect Express product.	正確填写expressProduct
            */
            string errcode = "";
            string errmsgZh = "";
            string errmsgCn = "";
            string errmsgEn = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_LOCKER_RETURN_CREATE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseLockerReturnCreateOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsgZh = msgDataResponse.errorMessageZh;
                        errmsgCn = msgDataResponse.errorMessageCn;
                        errmsgEn = msgDataResponse.errorMessageEn;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsgCn = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsgCn,
                data = resultdata
            };
        }

        #region 行李下单接口

        /// <summary>
        /// 机场行李送递服务下单接口
        /// 透过机场行李送递服务下单API下单API可以下从机场往市区的行李订单。
        /// 
        /// CustomerInfo 机场行李送递服务下单接口、上门行李送递服务下单接口
        /// CustomerInfo5 上门行李託运服务下单接口，如果有多位乘客 只有第一位需填电邮和电话 其余只需填姓名和机票號码
        /// 
        /// OrderInfoDTO3 机场行李送递服务下单接口
        /// OrderInfoDTO4 上门行李送递服务下单接口
        /// OrderInfoDTO5 上门行李託运服务下单接口
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult BaggageOrder(string partnerID, string checkword, MsgDataRequestBaggageOrder data, string accessToken = "", string environment = "sfapi-hk")
        {
            /*
            1. 接口简介
            机场行李运送服务提供以下接口

            按所选运送服务类型下单接口

            上门行李託运服务 確认/拒绝 推送接口

            注：如欲使用此服务，请先向负责销售同事提出请求確认对接方案后再按此文档进行开发。

            2. API 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_BAGGAGE_ORDER
            香港生产环境	https://sfapi-hk.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	application/x-www-form-urlencoded
            2.2. 公共请求参数
            #	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填，不可与accessToken字段同时传参签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填，不可与msgDigest同时传参获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 公共响应参数
            #	属性名	类型	是否必传	描述
            1	success	String	是	true 请求成功，false 请求失败
            2	errorCode	String	是	错误编码，成功不显示
            3	errorMessageZh	String	是	错误描述繁体中文
            4	errorMessageCn	String	是	错误描述简体中文
            5	errorMessageEn	String	是	错误描述英文
            6	obj	list	是	返回的详细数据

            3. 机场行李送递服务下单接口
            ​ 透过机场行李送递服务下单API下单API可以下从机场往市区的行李订单。

            ​ 呼叫API时需要附上以下的msgData。

            {
                "customerInfo": [
                    {
                  "senderName": "寄件⼈姓名",
                  "senderEmail": "sender@email.com",
                  "senderPhoneCountryCode": "+852",
                  "senderPhone": "12345678",
                  "senderInstantMsgType": "whatsapp",
                  "senderInstantMsgNo": "12345678",
                  "name": "收件⼈姓名",
                  "email": "receiver@email.com",
                  "instantMsgType": "wechat",
                  "instantMsgNo": "abc123",
                  "phoneCountryCode": "+852",
                  "phoneNumber": "98765432"
                    }
                ],
                "orderInfo": {
                  "orderType": "ibd",
                  "collectionTime": "2024-05-05 07:30:00",
                  "isHotel": "1",
                  "HotelName": "hotel name",
                  "noOfBags": "1",
                  "monthlyCard": "8520000001",
                  "deliveryDistrict": "Hong Kong",
                  "deliveryAddress": "delivery address",
                  "isSame": "1",
                  "remark": "remark",
                }
            }
            ​ CustomerInfo

            字段	字段名称	字段类型	是否必填
            senderName	寄件人姓名	String	必填
            senderEmail	寄件人电邮	String	必填
            senderPhoneCountryCode	寄件人电话地区代码	String	必填
            senderPhone	寄件人电话號码	String	必填
            senderInstantMsgType	寄件人即时通讯软件类型	String	非必填
            senderInstantMsgNo	寄件人即时通讯软件ID	String	非必填
            name	收件人姓名	String	当orderInfo中isSame为0时必填,为1时非必填
            email	收件人电邮	String	当orderInfo中isSame为0时必填,为1时非必填
            phoneCountryCode	收件人电话地区代码	String	当orderInfo中isSame为0时必填,为1时非必填
            phoneNumber	收件人电话號码	String	当orderInfo中isSame为0时必填,为1时非必填
            instantMsgType	收件人即时通讯软件类型	String	非必填
            instantMsgNo	收件人即时通讯软件ID	String	非必填
            ​ orderInfo

            字段	字段名称	字段类型	是否必填
            orderType	订单类型	String (ibd)	必填
            collectionTime	收件时间	String (yyyy-MM-dd HH:mm:ss)	必填
            isHotel	收件地点是否酒店	Integer (否:0 是:1)	必填
            HotelName	酒店名称	String	当isHotel为1时必填,为0时非必填
            hotelOrderNo	酒店订单编號	String	非必填
            noOfBags	行李数量	Integer	必填
            monthlyCard	月结號	String	必填
            deliveryDistrict	派送地区	String (Hong Kong,Kowloon,New Territories)	必填
            deliveryAddress	派送地址	String	必填
            isSame	收件人与寄件人信息是否一致	Integer(否:0 是:1)	必填
            remark	运单备註	String	非必填
            ​ 成功呼叫API后，將会回传以下JSON。

            {
                "apiErrorMsg": "",
                "apiResponseID": "00018F3C76C22F3FEC42ED26CADCCA3F",
                "apiResultCode": "A1000",
                "apiResultData": "{\"msg\":\"\",\"result\":{\"baggageFreeTime\":null,\"collectionTime\":\"2024-05-05 07:30:00\",\"deliveryTime\":\"2024-05-05 14:00:00\",\"noOfBags\":1,\"orderId\":\"IBD-20240523104821-6898-42-1\",\"orderStatus\":0,\"price\":220.0,\"waybillNo\":\"SF1650010655751\"},\"succ\":\"ok\"}"
            }
            实际业务处理结果，需要查看响应属性apiResultData中的详细结果。

            成功呼叫API后，將会回传以下apiResultData，waybillNo为运单號。

            {
                "msg": "",
                "result": {
                    "baggageFreeTime": null,
                    "collectionTime": "2024-05-05 07:30:00",
                    "deliveryTime": "2024-05-05 14:00:00",
                    "noOfBags": 1,
                    "orderId": "IBD-20240523104821-6898-42-1",
                    "orderStatus": 0,
                    "price": 220.0,
                    "waybillNo": "SF1650010655751"
                },
                "succ": "ok"
            }
            ​ 失败响应，错误原因请参考业务异常代码。

            {
                "msg": "Time Slot expired",
                "result": null,
                "succ": "fail",
                "error_code": 20000
            }
            4. 上门行李送递服务下单接口
            ​ 透过上门行李送递服务下单API可以下从市区往机场的上门收件的行李订单。

            呼叫API时需要附上以下的msgData。

            {
                "customerInfo": [
                    {
                        "senderName": "寄件⼈姓名",
                        "senderEmail": "sender@email.com",
                        "senderPhoneCountryCode": "+852",
                        "senderPhone": "12345678",
                        "senderInstantMsgType": "whatsapp",
                        "senderInstantMsgNo": "12345678",
                        "name": "收件⼈姓名",
                        "email": "receiver@email.com",
                        "instantMsgType": "wechat",
                        "instantMsgNo": "abc123",
                        "phoneCountryCode": "+852",
                        "phoneNumber": "98765432"
                    }
                ],
                "orderInfo": {
                    "orderType": "hbd",
                    "collectionTime": "2024-05-06 09:00:00",
                    "isHotel": "1",
                    "HotelName": "hotel name",
                    "noOfBags": "1",
                    "monthlyCard": "8520000001",
                    "isSame": "1",
                    "pickUpFromDistrict": "Hong Kong",
                    "pickUpAddress": "pickUp address",
                    "needFlight": true,
                    "flightDepartureDate": "2024-05-06 18:05:00",
                    "airline": "ACA",
                    "flightNumber": "CX261",
                    "destAddress": "YVR",
                    "remark": "remark"
                }
            }
            ​ CustomerInfo

            字段	字段名称	是否必填
            senderName	寄件人姓名	必填
            senderEmail	寄件人电邮	必填
            senderPhoneCountryCode	寄件人电话地区代码	必填
            senderPhone	寄件人电话號码	必填
            senderInstantMsgType	寄件人即时通讯软件类型	非必填
            senderInstantMsgNo	寄件人即时通讯软件ID	非必填
            name	收件人姓名	当orderInfo中isSame为0时必填,为1时非必填
            email	收件人电邮	当orderInfo中isSame为0时必填,为1时非必填
            phoneCountryCode	收件人电话地区代码	当orderInfo中isSame为0时必填,为1时非必填
            phoneNumber	收件人电话號码	当orderInfo中isSame为0时必填,为1时非必填
            instantMsgType	收件人即时通讯软件类型	非必填
            instantMsgNo	收件人即时通讯软件ID	非必填
            ​ orderInfo

            字段	字段名称	字段类型	是否必填
            orderType	订单类型	String (hbd)	必填
            collectionTime	收件时间	String (yyyy-MM-dd HH:mm:ss)	必填
            isHotel	收件地点是否酒店	Integer (否:0 是:1)	必填
            HotelName	酒店名称	String	当isHotel为1时必填,为0时非必填
            noOfBags	行李数量	Integer	必填
            monthlyCard	月结號	String	必填
            isSame	收件人与寄件人信息是否一致	Integer (否:0 是:1)	必填
            pickUpFromDistrict	揽收地区	String (Hong Kong,Kowloon,New Territories)	必填
            pickUpAddress	揽收地址	String	必填
            needFlight	有否有填写航班信息	Boolean(否:false 是:true)	必填
            flightDepartureDate	航班起飞时间	String (yyyy-MM-dd HH:mm:ss)	当needFlight为true是必填,为false时非必填
            flightNumber	航班编號	String	当needFlight为true是必填,为false时非必填
            airline	航空公司	String	非必填
            destAddress	目的地机场	String	非必填
            remark	运单备註	String	非必填
            ​ 成功呼叫API后，將会回传以下JSON。

            {
                "apiErrorMsg": "",
                "apiResponseID": "00018F3C8900843FE9571D143A0C003F",
                "apiResultCode": "A1000",
                "apiResultData": "{\"msg\":\"\",\"result\":{\"baggageFreeTime\":\"2024-05-06 18:00:00\",\"collectionTime\":\"2024-05-06 09:00:00\",\"deliveryTime\":\"2024-05-06 16:00:00\",\"noOfBags\":1,\"orderId\":\"HBD-20240523105010-6899-7-1\",\"orderStatus\":0,\"price\":220.0,\"waybillNo\":\"SF1650010655366\"},\"succ\":\"ok\"}"
            }
            实际业务处理结果，需要查看响应属性apiResultData中的详细结果。

            成功呼叫API后，將会回传以下apiResultData，waybillNo为运单號。

            {
                "msg": "",
                "result": {
                    "baggageFreeTime": "2024-05-06 18:00:00",
                    "collectionTime": "2024-05-06 09:00:00",
                    "deliveryTime": "2024-05-06 16:00:00",
                    "noOfBags": 1,
                    "orderId": "HBD-20240523105010-6899-7-1",
                    "orderStatus": 0,
                    "price": 220.0,
                    "waybillNo": "SF1650010655366"
                },
                "succ": "ok"
            }
            ​ 失败响应，错误原因请参考业务异常代码。

            {
                "msg": "Time Slot expired",
                "result": null,
                "succ": "fail",
                "error_code": 20000
            }
            5. 上门行李託运服务下单接口
            ​ 透过上门行李託运服务下单API可以下从市区往机场的上门收件的託运行李订单。

            呼叫API时需要附上以下的msgData。

            {
                "customerInfo": [
                    {
                        "name": "寄件人姓名",
                        "email": "sender@email.com",
                        "eTicket": "A12345678910",
                        "nationality": "nationality",
                        "passportNumber": "HK123456",
                        "instantMsgType": "whatsapp",
                        "instantMsgNo": "12345678",
                        "phoneCountryCode": "+852",
                        "phoneNumber": "12345678"
                    },
                    {
                        "name": "乘客2姓名",
                        "eTicket": "B12345678910",
                        "nationality": null,
                        "passportNumber": null,
                        "instantMsgType": null,
                        "instantMsgNo": null,
                        "phoneCountryCode": null,
                        "phoneNumber": null,
                        "email": null
                    }
                ],
                "orderInfo": {
                    "collectionTime": "2024-04-19 09:00:00",
                    "orderType": "hba",
                    "monthlyCard": 8520000001,
                    "isHotel": 0,
                    "noOfBags": 1,
                    "flightDepartureDate": "2024-04-19 18:01:00",
                    "pickUpFromDistrictId": 1,
                    "pickUpAddress": "pick up address",
                    "flightNumber": "CX101",
                    "eTicketNo": "A12345678910",
                }
            }

            ​ CustomerInfo

            如果有多位乘客 只有第一位需填电邮和电话 其余只需填姓名和机票號码
            字段	字段名称	是否必填
            name	寄件人姓名	必填
            eTicket	预订参考编號／电子机票號码	必填
            email	寄件人电邮	必填
            phoneCountryCode	寄件人电话地区代码	必填
            phoneNumber	寄件人电话號码	必填
            nationality	护照国籍	非必填
            passportNumber	护照號码	非必填
            instantMsgType	寄件人即时通讯软件类型	非必填
            instantMsgNo	寄件人即时通讯软件ID	非必填
            ​ orderInfo

            字段	字段名称	字段类型	是否必填
            orderType	订单类型	String (hbd)	必填
            collectionTime	收件时间	String (yyyy-MM-dd HH:mm:ss)	必填
            isHotel	收件地点是否酒店	Integer (否:0 是:1)	必填
            HotelName	酒店名称	String	当isHotel为1时必填,为0时非必填
            noOfBags	行李数量	Integer	必填
            monthlyCard	月结號	String	必填
            isSame	收件人与寄件人信息是否一致	Integer (否:0 是:1)	必填
            pickUpFromDistrict	揽收地区	String (Hong Kong,Kowloon,New Territories)	必填
            pickUpAddress	揽收地址	String	必填
            flightDepartureDate	航班起飞时间	String (yyyy-MM-dd HH:mm:ss)	必填
            eTicket	寄件人预订参考编號／电子机票號码	String	必填
            flightNumber	航班编號	String	必填
            airline	航空公司	String	非必填
            destAddress	目的地机场	String	非必填
            remark	运单备註	String	非必填
            ​ 成功呼叫API后，將会回传以下JSON。

            {
                "apiErrorMsg": "",
                "apiResponseID": "00018F3D12D61A3FE0BC77203BF2513F",
                "apiResultCode": "A1000",
                "apiResultData": "{\"msg\":\"\",\"result\":{\"baggageFreeTime\":null,\"collectionTime\":\"2024-05-06 20:00:00\",\"deliveryTime\":\"2024-05-07 00:00:00\",\"noOfBags\":1,\"orderId\":\"HBA-20240523104417-6893-1-1\",\"orderStatus\":0,\"price\":370.0,\"waybillNo\":\"\"},\"succ\":\"ok\"}"
            }
            ​ 成功呼叫API后，將会回传以下apiResultData。

            {
                "msg": "",
                "result": {
                    "baggageFreeTime": null,
                    "collectionTime": "2024-05-06 20:00:00",
                    "deliveryTime": "2024-05-07 00:00:00",
                    "noOfBags": 1,
                    "orderId": "HBA-20240523104417-6893-1-1",
                    "orderStatus": 0,
                    "price": 370.0,
                    "waybillNo": ""
                },
                "succ": "ok"
            }
            ​ 失败响应，错误原因请参考业务异常代码。

            {
                "msg": "Time Slot expired",
                "result": null,
                "succ": "fail",
                "error_code": 20000
            }
            7. 错误代码
            7.1. （API）平台结果代码列表
            标识	说明	解决方法
            A1000	统一接入平台校验成功，调用后端服务成功; 注意：不代表后端业务处理成功，实际业务处理结果，需要查看响应属性apiResultData中的详细结果	表示接口调用正常
            A1001	必传参数不可为空	请做以下几点检查：1、参数列表必传字段未填写 2、请求报文头，未配置Content-type：application/x-www-form-urlencoded 3、参数key存在空格问题 4、http请求参数都通过http URL编码传送 5、业务数据报文（msgData）为json报文数据格式 6、接口整体报文为form表单
            A1011	OAuth2认证失败	使用OAuth2认证会产生该提示请检查业务接口的accessToken参数是否超过2小时，2小时口令会更新，请调用OAuth2认证接口重新获取
            A1003	IP无效	顾客编码（partnerID）配置了需校验IP，请解除校验或按绑定IP调用接口
            A1004	无对应服务权限	可能存在的原因：1、顾客编码（partnerID）没有配置（关联）对应接口的业务接口，请在【开发者对接】-【API列表】中关联；2、接口请求数据与实际环境不一致，请先查看【开发者对接】-【API列表】接口状态： a、【测试中】请使用沙箱环境 b、【已上线】请使用正式环境；3、后台配置没有生效，可等待2分钟后在试试，如果还是无法操作，请报障人工处理
            A1005	流量受控	丰桥为接口功能联调环境，接口整体都有限流管控，单客户编码对应的每个接口限流规则：1、单接口调用30次/s 2、单接口调用3000次/天请尽量只操作功能联调，切勿进行接口压测，谢谢！
            A1006	数字签名无效	请做以下几点检查：1、确认checkword是否配置正确 2、确认verifyCode、msgDigest是否加密加签正确 3、确认参数是否有特殊字符，如：& 4、参数整体式form表单格式 5、非java类语言，需注意特殊字符，目前支持的特殊字符“*”，“空格”，“-”请优先使用 6、如果数字签名操作不便，可改为OAuth2认证，Token交互即可，具体参见【开发规范】【鉴权方式说明】
            A1008	数据解密失败	在特殊场景中使用，如有出现请报障人工处理
            A1009	目标服务异常或不可达	接口下游服务异常，如有出现请报障人工处理
            A1010	状态为沙箱测试	该问题在老客户中会有此类问题，新客户不会出现，如有出现请报障人工处理
            A1099	系统异常	接口服务异常，如有出现请报障人工处理
            7.2. 业务异常代码
            错误代码(error_code)	错误描述(msg)	解释
            10000	apiKey not found	在header没有传apiKey
            10001	apiKey not valid	apiKey错误或已失效
            10002	token not found	在header没有传token
            10003	token expired	Token已过期
            10004	unable to connect to redis	Token暂存伺服器故障
            20000	Time Slot expired	寄件时间已过下单截止时间
            20001	Fail to place bsp order	运单建立失败
            20002	No available Time Slot	没有可选寄件时间
            30000	orderInfo not found	在body没有传orderInfo
            30001	orderInfo not valid	orderInfo参数错误或不完整
            30002	customerInfo not found	在body没有传customerInfo
            30003	customerInfo not valid	customerInfo参数错误或不完整
            30004	orderType not found	在body没有传orderType
            30005	orderType not valid	orderType参数错误
            400	Bad Request	参数错误
            500	Internal Server Error	未知错误
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_BAGGAGE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseBaggageOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.result);
                        if (msgDataResponse.succ == "ok")
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.error_code;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 上门行李託运服务 確认/拒绝 推送接口
        /// 上门行李託运服务的订单在被確认或拒绝之后，系统会呼叫用户提供的API地址，资料会附在Response Body中。API请求时间为10秒，收到后请回覆200 OK 表示请求已成功。
        /// URL: 预先提交的API地址
        /// Method: HTTP POST
        /// </summary>
        /// <param name="body">顺丰推送过来的数据</param>
        /// <param name="reqData">顺丰推送过来的数据转换后的实体</param>
        /// <returns></returns>
        public static ResponseRoutePushService PushBaggageOrder(string body, out RequestRoutePushService reqData)
        {
            /*
            6. 上门行李託运服务 確认/拒绝 推送接口
            上门行李託运服务的订单在被確认或拒绝之后，系统会呼叫用户提供的API地址，资料会附在Response Body中。API请求时间为10秒，收到后请回覆200 OK 表示请求已成功。

            URL: 预先提交的API地址

            Method: HTTP POST

            Response Body
            API呼叫时会附上以下的Response Body。

            字段	字段名称	字段类型	是否必传
            time	API呼叫时的系统时间	String (yyyy-MM-dd HH:mm:ss)	是
            orderId	订单编號	String	是
            confirmStatus	订单確认状態	String (已確认:“confirmed” 已拒绝:"")	是
            waybillNo	运单编號	String	否,订单被拒绝不会生成运单编號
            hash	验证杂凑	String	是
            Hash 生成方法 :

            以升序把以上的非空的栏位的值组合后，在最后加上客户专属的杂凑字串，以Sha1得出加密后的验证杂凑。
            confirmStatus|orderId|time|waybillNo|hash secret
            以以下待回传的资料为例，客户专属的杂凑字串为22e1519591c3494bbec0cb3be449a6a8

            {
                "confirmStatus" = "confirmed",
                "orderId" = "HBA-20240418160410-6438-1-1",
                "time" = "2024-04-18 04:04:23", 
                "waybillNo" = "SF1660014959969"
            }
            因为该订单已被確认，所以有waybillNo字段，因此待加密字串如下

            - confirmStatus|orderId|time|waybillNo|hash secret
            - 订单確认状態|订单编號|时间|运单编號|验证杂凑
            confirmed|HBA-20240418160410-6438-1-1|2024-04-18 04:04:23|SF1660014959969|22e1519591c3494bbec0cb3be449a6a8
            经Sha1得出以下验证杂凑

            218c2f87ae4481fd9058916b41e342c8797b80b6
            以下数据会在Request Body 以POST方式送出

            {
                "confirmStatus" = "confirmed",
                "orderId" = "HBA-20240418160410-6438-1-1",
                "time" = "2024-04-18 04:04:23", 
                "waybillNo" = "SF1660014959969"
                "hash" = "21a46a0e586499363c3d490b5767972012e0ddeb"
            }
            以以下待回传的资料为例，客户专属的杂凑字串为22e1519591c3494bbec0cb3be449a6a8

            {
                "confirmStatus" = "rejected",
                "orderId" = "HBA-20240418161536-6448-1-1",
                "time" = "2024-04-18 04:16:19"
            }
            因为该订单已被拒绝，所以没有waybillNo字段，因此待加密字串如下

            - confirmStatus|orderId|time|hash secret
            - 订单確认状態|订单编號|时间|验证杂凑
            rejected|HBA-20240418161536-6448-1-1|2024-04-18 04:16:19|22e1519591c3494bbec0cb3be449a6a8
            经Sha1得出以下验证杂凑

            fcd6b7dc4d496bc85845cf6150e0272d86b12927
            以下数据会在Request Body 以POST方式送出

            {
                "confirmStatus" = "rejected",
                "orderId" = "HBA-20240418161536-6448-1-1",
                "time" = "2024-04-18 04:16:19",
                "hash" = "fcd6b7dc4d496bc85845cf6150e0272d86b12927"
            }
            */
            string return_code = "1000";
            string return_msg = "系统异常";

            if (!string.IsNullOrEmpty(body))
            {
                var request = JsonHelper.DeserializeObject<RequestRoutePushService>(body);
                if (request != null)
                {
                    reqData = request;
                    return_code = "0000";
                    return_msg = "成功";
                }
                else
                {
                    reqData = null;
                }
            }
            else
            {
                reqData = null;
            }
            return new ResponseRoutePushService()
            {
                return_code = return_code,
                return_msg = return_msg
            };
        }

        #endregion 行李下单接口

        /// <summary>
        /// OMCS车辆需求下单接口
        /// OMCS-非标临时需求新增修改
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static JsonResult OmcsRussianSubRequireSave(string partnerID, string checkword, MsgDataRequestOmcsRussianSubRequireSave data, string accessToken = "")
        {
            /*
            接口说明：
            OMCS-非标临时需求新增修改

            接口公共参数

            名称	值
            接口服务代码	COM_RECE_OMCS_RUSSIAN_SUB_REQUIRE_SAVE
            生产环境地址	https://bspgw.sf-express.com/std/service
            接口类型	接入
            报文类型	JSON
            公共请求参数

            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填，不可与accessToken字段同时传参签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填，不可与msgDigest同时传参获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            msgData参数

            参数名称	参数说明	是否必有	数据类型	说明
            mainLineRequireId	规划需求ID	否	long	
            lineRequireId	计划需求ID	修改的时候必填	long	-
            lineRequireDate	线路需求日期	是	date	-
            lastestArriveGrdTm	最晚到车时间	是	date	-
            lastestReachGrdTm	最晚靠车时间	是	date	-
            departGrdTm	发出时间	是	date	-
            arriveGrdTm	到车时间	是	date	-
            lineCode	线路编码	是	string	-
            cvyName	运力名称	是	string	-
            transoportLevel	运输等级	是	long	-
            lineRequiraDeptCode	线路需求所属网点	是	string	-
            lineAreaBelong	线路所属地区代码	是	string	-
            lastestReachTm	最晚靠车时间	是	date	-
            lastestArriveTm	最晚到车时间	是	date	-
            applyDay	适用工作日	是	string	-
            srcZoneCode	始发地网点代码	是	string	-
            destZoneCode	目的地网点代码	是	string	-
            departTm	发出时间	是	date	-
            arriveTm	到车时间	是	date	-
            sendBatchDate	发出班次日期	是	date	-
            sendWorkDay	发出班次日期工作日	是	string	-
            sendBatch	始发地发出班次	是	string	-
            arriveBatch	目的地到达班次	是	string	-
            lineDistance	线路里程（KM）	是	double	-
            crossDays	跨天数	是	long	-
            isStopOver	是否经停	是	long	-
            vehicleType	车辆类型	是	string	-
            capacityLoad	运力载量 单位T	是	double	-
            fullLoadWeight	满载重量（kg）	是	double	-
            fullLoadVolume	满载容积（m3）	是	double	-
            effectDate	需求生效时间	是	date	-
            invalidDate	需求失效时间	是	date	-
            conveyanceType	运力类型	是	long	1=全货机,2=散航班,3=铁路,4=水运，5=干支线
            planArriveTm	始发地计划到场时间	是	date	-
            planEndTm	目的地计划结束时间	是	date	-
            arriveBatchDate	到达班次日期	是	date	-
            requireCategory	需求类别	是	long	-
            requireChangeReason	需求变更原因说明	是	string	-
            isNetworkRequire	是否网点需求	是	long	-
            stopOverZoneCode	经停点代码（多个逗号隔开）	是	string	-
            isSpecial	专项类型	是	integer	-
            bigCustomerCode	大客户编码	选择专项类型后必填	string	-
            bigCustomerName	大客户名称	选择专项类型后必填	string	-
            requireChangeCategory	需求原因变更类别	是	long	-
            lingDanVolume	零担体积	需求类别为零担必填	string	-
            lingDanQuantity	零担件量	需求类别为零担必填	string	-
            vehicleLength	车长	是	string	-
            distTimeSource	里程时长来源	是，可以写死1	string	-
            distances	里程	是	string	-
            times	时长	是	string	-
            operator	操作人工号	是	string	-
            collectDispersalType	集散货类型	是	integer	1=集货，2=散货，3=集散货
            warmArea	温区	是	string	-
            lineCodeNew	线路编码新	是	string	-
            sendBatchNew	发出班次新	是	string	-
            arriveBatchNew	到达班次新	是	string	-
            systemName	系统来源	是	string	-
            请求报文参考：

            {
	            "mainLineRequireId": 668000007,
	            "lineRequireId": 2212231000109,
	            "lineRequireDate": "2023-08-31",
	            "lastestArriveGrdTm": "2023-08-31 02:40",
	            "lastestReachGrdTm": "2023-08-31 02:20",
	            "departGrdTm": "2023-08-31 03:10",
	            "arriveGrdTm": "2023-08-31 02:40",
	            "lineCode": "432AB025AD0310",
	            "cvyName": "磐石瑞金0310（常规-融通快运）",
	            "transoportLevel": 3,
	            "lineRequiraDeptCode": "755Q",
	            "lineAreaBelong": "755Y",
	            "lastestReachTm": "2023-08-31 02:20",
	            "lastestArriveTm": "2023-08-31 02:40",
	            "applyDay": "4",
	            "srcZoneCode": "755A",
	            "destZoneCode": "021B",
	            "departTm": "2023-08-31 03:10",
	            "arriveTm": "2023-08-31 03:46",
	            "sendBatchDate": "2023-08-31",
	            "sendWorkDay": "4",
	            "sendBatch": "432AB01P",
	            "arriveBatch": "025AD01P",
	            "lineDistance": 2022.519,
	            "crossDays": 2,
	            "isStopOver": 1,
	            "vehicleType": "002001",
	            "capacityLoad": 7,
	            "fullLoadWeight": 1500,
	            "fullLoadVolume": 100,
	            "effectDate": "2023-08-31",
	            "invalidDate": "2023-08-31 23:59:59",
	            "conveyanceType": 5,
	            "planArriveTm": "2023-08-31 02:40",
	            "planEndTm": "2023-08-31 04:16",
	            "arriveBatchDate": "2023-08-31",
	            "requireCategory": 0,
	            "requireChangeReason": "pass日需求临时新增或修改测试",
	            "isNetworkRequire": 1,
	            "stopOverZoneCode": "755W,021W",
	            "isSpecial": 4,
	            "bigCustomerCode": "ADAD",
	            "bigCustomerName": "大客户名称",
	            "requireChangeCategory": 401,
	            "lingDanVolume": 0,
	            "lingDanQuantity": 0,
	            "vehicleLength": "7.6",
	            "distTimeSource": 1,
	            "distances": "978.854",
	            "times": "854",
	            "operator": "166046",
	            "collectDispersalType": 1,
	            "warmArea": "0",
	            "lineCodeNew": "432AB025AD0310-0600P",
	            "sendBatchNew": "1000P432AB",
	            "arriveBatchNew": "0600P025AD",
	            "systemName": "EOS-CPASS-CORE"
            }
            返回参数

            参数名称	参数说明	是否必有	数据类型	说明
            success	是否成功	是	boolean	-
            errorMessage	错误信息	-	string	-
            errorCode	错误码	-	string	-
            response	结果数据	-	object	-
            response字段

            参数名称	参数说明	是否必有	数据类型	说明
            id	数据库主键ID	是	long	-
            mainLineRequireId	规划需求ID	-	long	-
            lineRequireId	计划需求ID	-	long	-
            lineRequireDate	线路需求日期	-	date	-
            lineId	车次ID	-	long	-
            lineCode	线路编码	-	string	-
            cvyName	运力名称	-	string	-
            transoportLevel	运输等级	-	long	-
            lineRequiraDeptCode	线路需求所属网点	-	string	-
            lineAreaBelong	线路所属地区代码	-	string	-
            lastestReachTm	计划靠车时间	-	date	-
            lastestArriveTm	始发地最晚到车时间	-	date	-
            applyDay	适用工作日	-	string	-
            srcZoneCode	始发地网点代码	-	string	-
            destZoneCode	目的地网点代码	-	string	-
            departTm	始发地计划发车时间	-	date	-
            arriveTm	目的地计划到车时间	-	date	-
            sendBatchDate	发出班次日期	-	date	-
            sendWorkDay	发出班次日期工作日	-	string	-
            sendBatch	发出班次	-	string	-
            arriveBatch	到达班次	-	string	-
            lineDistance	线路里程(KM)	-	double	-
            crossDays	跨天数	-	long	-
            isStopOver	是否经停	-	long	1=是,0=否
            vehicleType	车辆类型	-	string	-
            capacityLoad	运力载量(T)	-	double	-
            createTm	创建时间	-	date	-
            fullLoadWeight	满载重量(KG)	-	double	-
            fullLoadVolume	满载容积(m3)	-	double	-
            conveyanceType	运力类型	-	long	-
            planArriveTm	始发地计划到场时间	-	date	-
            version	版本	-	long	-
            arriveBatchDate	到达班次日期	-	date	-
            modifyTm	修改时间	-	date	-
            srcCoordinate	始发地网外地址经纬度	否	string	-
            srcNotZoneAddr	始发地网外地址名称	否	string	-
            destCoordinate	目的地网外地址经纬度	否	string	-
            destNotZoneAddr	目的地网外地址名称	否	string	-
            requireCategory	需求类别	-	long	-
            creator	创建人	-	string	-
            send	"是否发送给ground	是	long	1=是,0=否
            requireType	需求变更类型	-	long	21新增-临时需求、22调整-临时需求、23删除-临时需求、25调整-计划需求、26删除-计划需求
            requireChangeReason	需求变更原因	-	string	-
            requireSource	需求来源	-	long	-
            dataSource	数据来源	-	long	-
            updater	更新人	-	string	-
            isNetworkRequire	是否网点需求	-	long	0=非网点,1=网点
            srcNotZoneId	始发地网外地址ID	-	long	-
            destNotZoneId	目的地网外地址ID	-	long	-
            stopOverZoneCode	经停点代码(多个逗号隔开)	-	string	-
            taskId	车管任务ID	否	string	-
            driverId	司机ID	否	string	-
            driverName	司机名称	否	string	-
            telephoneNumber	司机电话号码	否	string	-
            vehicleSerial	车牌号码	否	string	-
            mode	经营模式	否	integer	-
            carStatus	订单状态	否	integer	-
            resultDesc	原因描述	否	string	-
            requireChangeCategory	需求原因变更类别	是	long	-
            vehicleLength	车长	否	string	-
            param	扩展参数	否	map	-
            lineCodeNew	线路编码新	-	string	-
            sendBatchNew	发出班次新	-	string	-
            arriveBatchNew	到达班次新	-	string	-
            标准返回报文参考：

            {
                "success": true,
                "errorMessage": null,
                "errorCode": null,
                "response": [
                    {
                        "id": 37101409,
                        "mainLineRequireId": 668000007,
                        "lineRequireId": 2212231000109,
                        "lineRequireDate": 1693411200000,
                        "lineId": 4453321,
                        "lineCode": "432AB025AD0310",
                        "cvyName": "磐石瑞金0310（常规-融通快运）",
                        "transoportLevel": 3,
                        "lineRequiraDeptCode": "755Q",
                        "lineAreaBelong": "755Y",
                        "lastestReachTm": 1693419600000,
                        "lastestArriveTm": 1693420800000,
                        "applyDay": "4",
                        "srcZoneCode": "755A",
                        "destZoneCode": "021B",
                        "departTm": 1693422600000,
                        "arriveTm": 1693424760000,
                        "sendBatchDate": 1693411200000,
                        "sendWorkDay": "4",
                        "sendBatch": "432AB01P",
                        "arriveBatch": "025AD01P",
                        "lineDistance": 2022.519,
                        "crossDays": 2,
                        "isStopOver": 1,
                        "vehicleType": "002001",
                        "capacityLoad": 7.0,
                        "createTm": 1693378312000,
                        "fullLoadWeight": 1500.0,
                        "fullLoadVolume": 100.0,
                        "conveyanceType": 5,
                        "planArriveTm": 1693420800000,
                        "version": 1,
                        "arriveBatchDate": 1693411200000,
                        "modifyTm": 1693378312000,
                        "srcCoordinate": null,
                        "srcNotZoneAddr": null,
                        "destCoordinate": null,
                        "destNotZoneAddr": null,
                        "requireCategory": 0,
                        "creator": "166046",
                        "send": 1,
                        "requireType": 21,
                        "requireChangeReason": "pass日需求临时新增或修改测试",
                        "requireSource": 2,
                        "dataSource": 34,
                        "updater": "166046",
                        "isNetworkRequire": 1,
                        "srcNotZoneId": null,
                        "destNotZoneId": null,
                        "stopOverZoneCode": "755W,021W",
                        "taskId": null,
                        "driverId": null,
                        "driverName": null,
                        "telephoneNumber": null,
                        "vehicleSerial": null,
                        "mode": null,
                        "carStatus": null,
                        "resultDesc": null,
                        "requireChangeCategory": 401,
                        "vehicleLength": "7.6",
                        "param": {},
                        "lineCodeNew": "432AB025AD0310-0600P",
                        "sendBatchNew": "1000P432AB",
                        "arriveBatchNew": "0600P025AD"
                    }
                ]
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_OMCS_RUSSIAN_SUB_REQUIRE_SAVE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, "bspgw");
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseOmcsRussianSubRequireSave>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.response);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// OMCS车辆需求取消接口
        /// OMCS非标临时需求取消接口
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static JsonResult OmcsRussianSubRequireDel(string partnerID, string checkword, MsgDataRequestOmcsRussianSubRequireDel data, string accessToken = "")
        {
            /*
            接口说明：
            OMCS非标临时需求取消接口

            接口公共参数

            名称	值
            接口服务代码	COM_RECE_OMCS_RUSSIAN_SUB_REQUIRE_DEL
            生产环境地址	https://bspgw.sf-express.com/std/service
            接口类型	接入
            报文类型	JSON
            公共请求参数

            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填，不可与accessToken字段同时传参签名方法参考：数字签名认证说明
            6	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填，不可与msgDigest同时传参获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            msgData参数

            参数名称	参数说明	是否必有	数据类型	说明
            lineRequireId	计划需求ID	是	long	-
            systemName	系统编码	是	string	-
            deleteReasonCode	删除原因类别	是	long	-
            deleteReason	删除原因说明	是	string	-
            userName	删除人工号	是	string	-
            请求报文参考：

            {
	            "lineRequireId": 2309151524841722,
	            "systemName": "EOS-PASS-RSS",
	            "deleteReasonCode": 513,
	            "deleteReason": "删除",
	            "userName": "166046"
            }
            返回参数

            参数名称	参数说明	是否必有	数据类型	说明
            success	是否成功	是	boolean	-
            errorMessage	错误信息	-	string	-
            errorCode	错误码	-	string	-
            response	结果数据	-	boolean	-
            请求报文参考：

            {
                "success": true,
                "errorMessage": null,
                "errorCode": null,
                "response": true
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_OMCS_RUSSIAN_SUB_REQUIRE_DEL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, "bspgw");
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseOmcsRussianSubRequireDel>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.response);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 退厂质检结果上报
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult SgspdcsInspectionResults(string partnerID, string checkword, MsgDataRequestSgspdcsInspectionResults data, string accessToken = "", string environment = "sfapi")
        {
            /*
            2.1. 公共参数
            名称	值
            接口服务代码	COM_RECE_SGSPDCS_INSPECTIONRESULTS
            生产环境地址	https://sfapi.sf-express.com/std/service
            沙箱环境地址	https://sfapi-sbox.sf-express.com/std/service
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（COM_RECE_EPS_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	expiresIn	Number	条件	accessToken,使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 业务数据报文
            序号	参数列表	类型	是否必传	含义
            1	clientCode	String	是	客户编码
            2	results	array	是	质检结果列表
            msgData.results请求参数

            序号	参数列表	类型	是否必传	含义
            1	waybillNo	String	是	运单号
            2	inspectionResult	String	是	检查结果 1：合格 2：不合格
            3	inspectionTime	long	是	检查时间格式。时间戳：ms
            2.4. 请求示例
            {
	            "clientCode": "zjtd",
	            "results": [
		            {
			            "waybillNo": "SF4000006877771",
			            "inspectionResult": "1",
			            "inspectionTime": "1723187801000"
		            }
	            ]
            }
            2.5. 业务响应参数
            序号	参数列表	类型	说明
            1	success	boolean	操作是否成功
            1	obj	boolean	业务是否成功
            2.6. 业务响应示例
            {
	            "requestId": null,
	            "success": true,
	            "business": null,
	            "errorCode": null,
	            "errorMessage": null,
	            "params": [
		            null
	            ],
	            "date": null,
	            "version": null,
	            "obj": true
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "COM_RECE_SGSPDCS_INSPECTIONRESULTS";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSgspdcs(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseSgspdcsInspectionResults>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }
        
        #endregion 其他
    }
}
